php 实现下载功能但出现404错误(laravel)

qjp7pelc  于 2023-04-04  发布在  PHP
关注(0)|答案(1)|浏览(104)

我正在尝试在我的代码中实现 * 下载所有文件 * 功能。我已经参考了stackoverflow中的一些链接来实现这一点。然而,我仍然在努力实现这一点,下面是下载控制器,

public function downloadDocuments($id)
    {
        $documents = DB::table('product_documents')->where('id', $id)->first();
        $path2 = $documents->file_path;
        $files = array(Storage::url($path2));
        $zip = new ZipArchive();
        $zip_name = time() . "documents.zip"; // Zip name
        $zip->open($zip_name,  ZipArchive::CREATE);
        foreach ($files as $file) {
            echo $path = "public/Product/Documents/" . $file;
            if (file_exists($path)) {
                $zip->addFromString(basename($path),  file_get_contents($path));
            } else {
                echo "file does not exist";
            }
        }
        $zip->close();
    }

这里是 * 下载 * 的 * 按钮 * 和 * 路线 *,
x一个一个一个一个x一个一个二个x
下面是存储所有文档/图像时的控制器。为了实验,我只想下载多个文档文件。我试了一次又一次,但它总是失败。请告诉我如何解决这个问题?谢谢

public function store(Request $request)
    {
        $data = $this->validate($request, [
            'name' => 'required',
            'description' => 'required|max:150',
            'category_id' => 'required',
            'type_id' => 'required',
            'price' => 'required|numeric|min:0|not_in:0',
            'start_date' => 'required',
            'end_date' => 'required',
            'is_active' => 'required',
            'images.*' => 'image|max:2048', // max file size: 2MB
            'documents.*' => 'file|max:2048', // max file size: 2MB
        ]);

        $product = DB::table('products')
            ->insertGetId([
                'name' => $data['name'],
                'description' => $data['description'],
                'type_id' => $data['type_id'],
                'category_id' => $data['category_id'],
                'price' => $data['price'],
                'start_date' => $data['start_date'],
                'end_date' => $data['end_date'],
                'is_password' => $request['is_password'],
                'is_stamping' => $request['is_stamping'],
                'created_at' => now(),
            ]);

        // handle image uploads
        if ($request->hasFile('images')) {
            $i = 1;
            foreach ($request->file('images') as $image) {
                $name = $request['name'] . '-' . $i;
                $now = new DateTime();
                $fileName = Str::slug($request['name']) . '-' . $now->format('dmYHis') . '-' . $i . '.' . $image->getClientOriginalExtension();
                //$fileName = Str::slug($request['name']) . '-' . time() . '.' . $image->getClientOriginalExtension();
                $path = $image->storeAs('public/Product/Images', $fileName);
                DB::table('product_images')->insert([
                    'product_id' => $product,
                    'name' => $name,
                    'file_path' => Storage::url($path),
                    'created_at' => now(),
                ]);
                $i++;
            }
        }

        // handle document uploads
        if ($request->hasFile('documents')) {
            $i = 1;
            foreach ($request->file('documents') as $document) {
                $name = $request['name'] . '-' . $i;
                $now = new DateTime();
                $fileName = Str::slug($request['name']) . '-' . $now->format('dmYHis') . '-' . $i . '.' . $document->getClientOriginalExtension();
                //$fileName = Str::slug($request['name']) . '-' . time() . '.' . $document->getClientOriginalExtension();
                $path = $document->storeAs('public/Product/Documents', $fileName);
                DB::table('product_documents')->insert([
                    'product_id' => $product,
                    'name' => $name,
                    'file_path' => Storage::url($path),
                    'created_at' => now(),
                ]);
                $i++;
            }
        }

        $now = Carbon::now();
        $month = $now->format('m');
        $year = $now->format('Y');

        DB::table('log_audits')->insert([
            'module_name' => 'Jualan',
            'description' => 'Simpan Produk ' . $data['name'],
            'user_id' => auth()->user()->id,
            'created_at' => $now,
            'month' => $month,
            'year' => $year,
        ]);
        return Redirect::route('produk.index');
    }

一开始,我尝试实现Zipper/Chumper方法,但它不起作用,因为这个Web应用程序运行在laravel 7上,而不是laravel 5。所以后来我做了一些研究,发现我可以使用ZipArchive。在编写代码并尝试运行它之后。我得到了404错误。我确信我可能在代码中遗漏了一些东西,或者可能我编写并引用了错误的东西。请帮帮忙

uqjltbpv

uqjltbpv1#

我认为你的代码中有很多问题。
首先,<Link>组件不接受路由名称,而是接受路径。要使用路由名称,您需要使用ziggy route()帮助程序。
您可以尝试:

<Link :href="route('product-documents.download')">
    <span
        className="flex items-center justify-center"
        data-tooltip-id="my-tooltip"
        data-tooltip-content="Download dokumen"
    >
    <DocumentArrowDownIcon className="h-4 w-4" />
    </span>
</Link>

<Link href="/download-documents')">
    <span
        className="flex items-center justify-center"
        data-tooltip-id="my-tooltip"
        data-tooltip-content="Download dokumen"
    >
    <DocumentArrowDownIcon className="h-4 w-4" />
    </span>
</Link>

其次,目前你的downloadDocuments($id)函数需要一个你没有设置的id(你不需要下载所有的文档)。

相关问题