1

我正在尝试让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 文件可以正常工作。然而,这是不可取的,因为我将处理可能有几 GB 大的文件。

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 文件出了什么问题?

谢谢!

4

1 回答 1

0

通过为参数指定“存储”来使其工作storage_method

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

于 2017-09-27T04:11:36.953 回答