使用PHP类ZipArchive创建zip文件,而无需将文件写入磁盘?

36

我想使用ZipArchive(或本地PHP类)在内存中创建一个zip文件,并将文件内容读取回客户端。是否可能?如果是,怎么做?

我想在此应用程序中压缩的文件最大为15 MB,从内存方面来看应该没问题。


3
好的,我会尽力。以下是需要翻译的内容:Duplicate: https://dev59.com/wXNA5IYBdhLWcg3wL6oc - pestaa
你将如何处理超出PHP可用内存的zip归档文件? - bcosca
请让这个问题保持开放状态,https://dev59.com/wXNA5IYBdhLWcg3wL6oc 的提问方式可以获得有用的答案。 - CLJ
抱歉,您的评论使我感到困惑。请解释一下。 - Oddthinking
@Oddthinking,抱歉。其他问题和答案都跳过了打开zip文件进行写入的部分(http://www.php.net/manual/en/function.ziparchive-open.php),这是整个问题的关键所在。如果不解决这个问题,那么问题就无法解决。 - CLJ
4个回答

6
尝试使用ZipStream(链接到GitHub存储库,也支持通过Composer安装)。
来自原作者网站(现已关闭):

ZipStream是一个库,用于从PHP动态流式传输动态zip文件,而无需在服务器上写入任何磁盘。


1
我发现这个是一个很好的替代死链的工具:https://github.com/maennchen/ZipStream-PHP$zip = new \ZipStream\ZipStream('bulk-export.zip'); $zip->addFile('users.csv', '(csv data generated by another method here)'); $zip->finish(); - Hans

5
感谢Frosty Z提供的伟大库ZipStream-PHP。我们有一个使用案例需要将一些大型zip文件以数量和大小上传到S3,但官方文档并没有提到如何上传到S3。因此,我们想到了直接将ZipStream创建的zip输出流直接传输到S3而不在服务器上创建zip文件的想法。以下是我们设计的可行示例代码:
<?php
# Autoload the dependencies
require 'vendor/autoload.php';

use Aws\S3\S3Client;
use ZipStream\Option\Archive as ArchiveOptions;

//s3client service
$s3Client = new S3Client([
    'region' => 'ap-southeast-2',
    'version' => 'latest',
    'credentials' => [
        'key' => '<AWS_KEY>',
        'secret' => '<AWS_SECRET_KEY>',
    ]
]);
$s3Client->registerStreamWrapper(); //required

$opt = new ArchiveOptions();
$opt->setContentType('application/octet-stream');
$opt->setEnableZip64(false); //optional - for MacOs to open archives

$bucket = 'your_bucket_path';
$zipName = 'target.zip';

$zip = new ZipStream\ZipStream($zipName, $opt);

$path = "s3://{$bucket}/{$zipName}";
$s3Stream = fopen($path, 'w');

$zip->opt->setOutputStream($s3Stream); // set ZipStream's output stream to the open S3 stream

$filePath1 = './local_files/document1.zip';
$filePath2 = './local_files/document2.zip';
$filePath3 = './local_files/document3.zip';

$zip->addFileFromPath(basename($filePath1), $filePath1);
$zip->addFileFromPath(basename($filePath2), $filePath2);
$zip->addFileFromPath(basename($filePath3), $filePath3);

$zip->finish(); // sends the stream to S3
?>

3
请查看下面的库,它允许创建zip文件并将其作为流返回:PHPClasses.org

8
我希望有一个原生于标准 PHP 库的东西。 - CLJ
我可以问一下,这有什么原因吗? - Cpt. eMco
6
所以我不必引入依赖项并随时间维护它。如果它包含在标准库中,我就不必担心升级php版本时的不兼容性问题。 - CLJ
3
实际上,这是一个 PHP 类。它需要 PHP5。当 PHP6 推出时(不会很快),您应该担心升级问题。 - Joel A. Villarreal Bertoldi
1
@Chris:你也可以看一下这个网站http://pablotron.org/software/zipstream-php/,它在这里被建议使用:https://dev59.com/a3NA5IYBdhLWcg3wX8nk。 - Maxime Pacary
@FrostyZ 这应该是一个答案。 - jahu

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接