Laravel Zipstream 从流中添加文件

Posted

技术标签:

【中文标题】Laravel Zipstream 从流中添加文件【英文标题】:Laravel Zipstream add file from stream 【发布时间】:2017-09-24 05:24:38 【问题描述】:

我正在尝试让 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 文件出了什么问题?

谢谢!

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于Laravel Zipstream 从流中添加文件的主要内容,如果未能解决你的问题,请参考以下文章

从流中播放波形文件

NAudio在改变音高而不是文件时寻找一种从流中读取的方法

从流中以新方式排序数据

从流中以 Xamarin 表单呈现 PDF

从流中替换采样

C# - 从流中序列化/反序列化 DES 加密文件