4

我正在使用 php ZipArchive 即时创建一个 zip 文件并将其发送回用户。我将压缩文件临时存储在文档根目录上方的文件夹中,然后将其与代码一起发回

header('Content-type:application/zip');
header('Content-Disposition: inline; filename="'.("file.zip").'"');
header("Content-Transfer-Encoding: binary");
header("Content-Length:".filesize($file));
$fh = fopen($file,'rb');
fpassthru($fh);

在首次发布后

$zip->close()

以确保文件未打开。我遇到的问题是 - 存储的 zip 文件是一个有效的存档,我可以在 Windows 7、7Zip、WinZIP 等中打开它。但是,当我使用上面的代码发送文件时,它最终会得到一个 0xD 0xA 对在文件的开头,这足以使其损坏。我无法弄清楚这些角色可能来自哪里。这是 fopen/fpassthru 的已知错误吗?任何帮助将非常感激。

4

4 回答 4

16

我发现删除header("Content-Length:".filesize($file));线时它解决了我同样的问题......

于 2012-11-23T11:34:18.437 回答
12

在多次尝试下载 zip 文件后,解决方案是:

$result = create_zip($files_to_zip,$fileZip,true,$path_parts['dirname']);
ob_clean();
ob_end_flush(); // more important function - (without - error corrupted 
zip)
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header('Content-Type: application/zip;\n');
header("Content-Transfer-Encoding: Binary");
header("Content-Disposition: attachment; filename=\"".basename($fileZip)."\"");
readfile($fileZip);
unlink($fileZip);
exit();
于 2016-08-26T13:34:03.527 回答
4

你的完整剧本是什么样的?

一般来说,您应该删除脚本文件末尾的所有关闭 PHP 标记,因为它可能是来自脚本末尾的输出,或者包含的脚本。

于 2012-11-23T11:24:47.450 回答
0

谢谢@_on!你帮我提供了这些信息。但我没有删除header ("Content-Length:". Filesize ($ file)) ;,而是插入了一个换行符“\\n”,留下:

header ("Content-Length:". filesize ($ file). "\\n");

并且文件生成了它的大小以帮助下载 好的。Tks

于 2019-08-04T13:14:45.593 回答