nemo64/zip-stream

快速流式传输多个文件,无需首先创建归档。

v1.0.0 2019-01-28 15:43 UTC

This package is auto-updated.

Last update: 2024-09-29 03:20:48 UTC


README

Build Status Latest Stable Version Total Downloads Monthly Downloads License

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);