用PHP从两个字符串变量创建一个ZIP文件

6

我正在尝试的是取两个字符串并创建两个文件。然后将这些文件打包成zip文件并让用户下载。

以下是我的代码:

$string1 = 'Some data some data some data';
$string2 = 'Some data some data some data';


$zip = new ZipArchive();
$filename = "test.zip";

if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
   exit("cannot open <$filename>\n");
}


$zip->addFromString("string1.txt", $string1);
$zip->addFromString("string2.txt", $string2);
$zip->close();

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize('test.zip'));

目前还没有运气。 感谢您的任何帮助。


1
$zip->addFromString("string2.txt", $string1); 应该改为 $zip->addFromString("string2.txt", $string2); - Patashu
2
我没有看到你实际上传输你创建的zip文件的地方? - Francis Avila
哦...我应该怎么传输呢? - chiminage
请启用错误日志记录,将级别设置为高,并跟踪您的错误日志。修复报告的错误。如果您仍然无法理解,请编辑您的问题并使其更加精确。PHP通常会告诉您问题所在,您只需要阅读错误消息即可。https://dev59.com/aHRA5IYBdhLWcg3wvQlh - hakre
3个回答

9
你错过了最重要的部分 - 输出文件! :)
添加:
readfile('test.zip');

请将此段文字添加到php文件末尾。


另外,HTTP content-length头的计算有误:

header("Content-Length: ".filesize($zip));

这会一直返回0(或false),因为filesize需要一个文件名作为其参数。

将该行改为:

header("Content-Length: ".filesize('test.zip'));

做完这两步骤后,zip文件将会成功下载并包含这两个文件。为了完整起见,以下是一个完整的可行示例:
$string1 = 'Some data some data some data';
$string2 = 'Some data some data some data';


$zip = new ZipArchive();
$filename = "test.zip";

if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
   exit("cannot open <$filename>\n");
}


$zip->addFromString("string1.txt", $string1);
$zip->addFromString("string2.txt", $string1);
$zip->close();

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"".$filename."\"");
header("Content-Transfer-Encoding: binary");
// make sure the file size isn't cached
clearstatcache();
header("Content-Length: ".filesize('test.zip'));
// output the file
readfile('test.zip');

是的...我已经更改了,但我仍然得到一个zip文件,当你打开它时,它会弹出另一个zip文件,似乎是一个循环。 - chiminage
不客气。有时候我们会忽略最重要的事情 ;) (当我第一次看到文件大小问题时,我也错过了检查这个..别忘了修复它) - hek2mgl

1
您遇到了一个PHP错误(可能是因为您没有启用错误报告或者错误级别不够高)。
filesize()函数需要传入字符串而不是对象。使用filesize($filename)即可解决问题。
要启用错误报告,请执行以下操作:
error_reporting(E_ALL|E_STRICT); ini_set('display_errors', 1);
或者在php.ini中进行设置。

1
在所有这些header()调用之后,我想你想要的是:


readfile($filename); 

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