动态 PHP ZIP 文件

2022-08-30 10:35:59

从服务器上的文件夹中压缩(例如2个文件)并强制下载的最简单方法是什么?不将“zip”保存到服务器。

    $zip = new ZipArchive();
   //the string "file1" is the name we're assigning the file in the archive
$zip->addFile(file_get_contents($filepath1), 'file1'); //file 1 that you want compressed
$zip->addFile(file_get_contents($filepath2), 'file2'); //file 2 that you want compressed
$zip->addFile(file_get_contents($filepath3), 'file3'); //file 3 that you want compressed
echo $zip->file(); //this sends the compressed archive to the output buffer instead of writing it to a file.

有人可以验证:我有一个包含 test1.doc、test2.doc 和 test3 的文件夹.doc

在上面的例子中 - file1(file2和file3)可能只是test1.doc等。

我必须对“$filepath 1”做任何事情吗?这是保存3个文档的文件夹目录吗?

对不起我的基本问题..


答案 1

不幸的是,在 CentOS 5.x 上使用 PHP 5.3.4-dev 和 Zend Engine v2.3.0,我无法让上面的代码正常工作。“无效或统一化的Zip对象”错误消息是我所能得到的。因此,为了使它正常工作,我不得不使用以下片段(取自Jonathan Baltazar在 PHP.net 手册上的示例,在ZipArchive::open页面上):

// Prepare File
$file = tempnam("tmp", "zip");
$zip = new ZipArchive();
$zip->open($file, ZipArchive::OVERWRITE);

// Stuff with content
$zip->addFromString('file_name_within_archive.ext', $your_string_data);
$zip->addFile('file_on_server.ext', 'second_file_name_within_archive.ext');

// Close and send to users
$zip->close();
header('Content-Type: application/zip');
header('Content-Length: ' . filesize($file));
header('Content-Disposition: attachment; filename="file.zip"');
readfile($file);
unlink($file); 

我知道这与仅使用内存工作不同 - 除非你在ram中有你的tmp区域;-) - 但也许这可以帮助其他人,他们正在为上面的解决方案而苦苦挣扎,就像我一样;并且性能损失不是问题。


答案 2

您的代码非常接近。您需要使用文件名而不是文件内容。

$zip->addFile(file_get_contents($filepath1), 'file1');

应该是

$zip->addFile($filepath1, 'file1');

http://us3.php.net/manual/en/function.ziparchive-addfile.php

如果需要从变量而不是文件添加文件,则可以使用 addFromString 函数。

$zip->addFromString( 'file1', $data );

推荐