7

我有这个代码

<?php
$files = array('includes/s.xlsx', 'includes/test.html');
$zipname = 'file.zip';
$zip = new ZipArchive;
$zip->open($zipname, ZipArchive::CREATE);
foreach ($files as $file) {
  $zip->addFile($file);
 }
$zip->close();


header('Content-Type: application/zip');
header('Content-disposition: attachment; filename=filename.zip');
header('Content-Length: ' . filesize($zipname));
readfile($zipname);

但我不想将 zip 文件保存到服务器,我只想将它提供给用户。

4

3 回答 3

8

ZIP 不是一种可流式格式(目标需要支持查找,即不能将 ZIP 文件简单地写入到无法重新读取和修改先前写入的数据的目标)您尝试做的事情是行不通的。因此,最好的解决方案(如果您的 zip 文件不会很大)是在临时位置创建它readfile(),然后删除临时文件。

请参阅以下 Stack Overflow 问题以供进一步参考。它们包含一些可能适合您的解决方法:

于 2012-12-17T14:37:59.523 回答
5

尝试在之后添加readfile($zipname);

// delete the file from the server
unlink($zipname);
exit;
于 2014-01-24T14:21:09.087 回答
3

您正在使用该对象$zip打开和修改 zip 文件,但filesize()readfile()适用于文件名,因此您应该拥有以下内容:

header('Content-Length: ' . filesize($zipname));
readfile($zipname);

顺便说一句,您可以使用tempnam()生成一个“临时”文件来保存 zip 内容;一旦readfile()完成,你仍然必须这样做unlink()

于 2012-12-17T14:40:39.377 回答