6

所以我要做的是获取 2 个字符串并创建 2 个文件。然后从这些文件中创建一个 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'));

到目前为止还没有运气。任何帮助表示赞赏。

4

3 回答 3

9

您错过了最重要的部分 -输出文件!:)

添加:

readfile('test.zip');

到 php 文件的末尾。


HTTP content-length 标头的计算也是错误的:

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

这将始终为您提供 0(或 false),因为文件大小需要文件名作为其参数。

将行更改为:

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');
于 2013-03-07T00:36:47.207 回答
1

你有一个 PHP 错误(你可能没有打开错误报告或足够高的错误级别)。

filesize() 函数采用字符串而不是对象。filesize($filename) 将起作用。

要打开错误报告,请执行以下操作:

错误报告(E_ALL|E_STRICT);ini_set('display_errors', 1);

或者在 php.ini 中执行此操作

于 2013-03-07T00:39:51.963 回答
1

在所有这些 header() 调用之后,我认为您想要:

readfile($filename); 
于 2013-03-07T00:43:56.063 回答