nemo64 / zip-stream
快速流式传输多个文件,无需首先创建归档。
v1.0.0
2019-01-28 15:43 UTC
Requires
- php: >=7.1, <7.4
- guzzlehttp/psr7: ^1.5
- psr/http-message: ^1.0
Requires (Dev)
- ext-zip: ^1.0
- phpunit/phpunit: ^7.5
This package is auto-updated.
Last update: 2024-09-29 03:20:48 UTC
README
ZIP Stream
此库允许您创建一个包含多个文件的zip格式的PSR-7流。这不需要在任何时候实际创建zip文件,因此对资源的影响非常小。实际上,与仅通过php发送文件相比,差别应该非常小。
以下是某些特殊特性
- 不创建任何文件,因此不需要清理
- 在发送文件之前知道文件长度,因此可以创建
Content-Length
标头(这使用户知道下载需要多长时间) - 如果您的psr7-emitter框架支持,则可以恢复下载。
- 您不必将流输出到浏览器,例如,您可以在POST请求中使用guzzle进行流式传输。
- 没有平台依赖。您不需要
ext-zip
或机器上的zip命令。
但是也有一些限制
- 创建的zip文件完全没有压缩。这是为了快速计算大小所必需的。如果您需要这个功能,请使用maennchen/zipstream-php
- 目前还没有实现Zip64,因此您被限制在4GB文件。在32位php中可能还有其他限制,但我还没有调查。
示例
您需要一种方式将PSR-7响应对象发送到客户端。一些框架开始支持此功能,但在此期间,我建议您使用外部库如arrowspark/http-emitter 来实现这一点。
use function GuzzleHttp\Psr7\stream_for; use function GuzzleHttp\Psr7\try_fopen; use Narrowspark\HttpEmitter\SapiStreamEmitter; use Nemo64\ZipStream\ZipResponse; use Nemo64\ZipStream\ZipStream; $zip = new ZipStream(); $zip->add('file1.jpg', stream_for(try_fopen('file1.jpg', 'r'))); // be sure that before you send this response that there is no output buffering engaged. while (@ob_end_clean()) {} $response = ZipResponse::create($zip, 'my_archive.zip'); $emitter = new SapiStreamEmitter(); $emitter->emit($response);