如何从AWS S3将文件流式传输到Zip中

时间:2016-11-21 07:18:41

标签: php amazon-web-services amazon-s3 zip streaming

我正在使用the PHP Flysystem包来流式传输 AWS S3 存储桶中的内容。特别是,我正在使用$filesystem->readStream

我的问题

当我流式传输文件时,它最终会出现在 myzip.zip 中并且大小正确,但解压缩后,它会变成 myzip.zip.cpgz 。这是我的原型:

header('Pragma: no-cache');
header('Content-Description: File Download');
header('Content-disposition: attachment; filename="myZip.zip"');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
$s3 = Storage::disk('s3'); // Laravel Syntax
echo $s3->readStream('directory/file.jpg');

我做错了什么?

旁边问题

当我像这样流式传输文件时,是吗:

  1. 完全下载到我服务器的RAM中,然后转移到客户端,或
  2. 它是以块的形式保存在缓冲区中,然后转移到客户端吗?
  3. 基本上,如果流媒体有数十GB的数据,我的服务器是否负担过重?

1 个答案:

答案 0 :(得分:1)

您目前正在转储directory/file.jpg的原始内容作为zip(jpg不是zip)。您需要创建包含这些内容的zip文件。

而不是

echo $s3->readStream('directory/file.jpg');

使用Zip extension

在其位置尝试以下操作
// use a temporary file to store the Zip file
$zipFile = tmpfile();
$zipPath = stream_get_meta_data($zipFile)['uri'];
$jpgFile = tmpfile();
$jpgPath = stream_get_meta_data($jpgFile)['uri'];

// Download the file to disk
stream_copy_to_stream($s3->readStream('directory/file.jpg'), $jpgFile);

// Create the zip file with the file and its contents
$zip = new ZipArchive();
$zip->open($zipPath);
$zip->addFile($jpgPath, 'file.jpg');
$zip->close();

// export the contents of the zip
readfile($zipPath);

使用tmpfilestream_copy_to_stream,它将以块的形式下载到磁盘上的临时文件而不是RAM