Laravel Zipstream 从流中添加文件

Laravel Zipstream add file from stream

我正在努力让 ZipStream 在 Laravel 5.4 工作。我想从 s3 流式传输文件以创建返回给浏览器的 ZipStream。

目前我的代码生成与有效 ZIP 文件大小相同的损坏 ZIP 文件。

这是我的操作方法:

public function mediaZip(User $user)
{
    return response()->stream(function () use ($user) {
        $zip = new ZipStream($user->name . ".zip", [
            'content_type' => 'application/octet-stream'
        ]);

        foreach ($user->media as $medium) {
            $stream = Storage::disk("s3")->readStream($medium->location);
            $zip->addFileFromStream($medium->name, $stream);
        }

        $zip->finish();
    });
}

如果我使用下面的代码将每个文件读入内存,则 ZIP 文件可以正常工作。然而,这是不可取的,因为我将处理可能有几千兆字节大的文件。

public function mediaZip(User $user)
{
    return response()->stream(function () use ($user) {
        $zip = new ZipStream($user->name . ".zip", [
            'content_type' => 'application/octet-stream'
        ]);

        foreach ($user->media as $medium) {
            $file = Storage::disk("s3")->read($medium->location);
            $zip->addFile($medium->name, $file);
        }

        $zip->finish();
    });
}

谁能帮我弄清楚 ZIP 文件出了什么问题?

谢谢!

通过为 storage_method 参数指定 "store" 使其工作。

$zip->addFile($medium->name, $file, [], "store");