【问题标题】:ZIP Archive sent by PHP is corruptedPHP 发送的 ZIP 存档已损坏
【发布时间】:2019-08-04 21:14:45
【问题描述】:

我正在使用 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 的已知错误吗?任何帮助将不胜感激。

【问题讨论】:

  • 提示:有readfile可以直接输出文件...
  • 最后添加fclose($fh); exit(); 有帮助吗?
  • 另外,你确定没有其他输出吗? PHP文件本身的BOM?有空格吗?
  • 你非常接近 Deceze - 请参阅下面的评论。如果您回答而不是发表评论,我可能会很好地接受答案。我不会想到在所需脚本中终止 ?> 后的额外行会导致这么多麻烦。

标签: php zip


【解决方案1】:

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

【讨论】:

  • 这对我也有用,但是为什么???我让同一段代码工作了几个月,然后突然停止,然后通过删除这行代码,它又开始工作了!
  • 如果解决了问题,那么报告的文件大小可能与下载大小不匹配。在这种情况下,字节丢失/被添加。就我而言,我没有exit; 脚本,而另一个脚本正在将额外的 HTML 打印到文件中。只需cat download.zip 并分析损坏文件的输出。
【解决方案2】:

多次尝试下载 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();

【讨论】:

  • ob_clean() 和 ob_end_flush() 解决了问题,谢谢
  • 我试过 ob_clean()ob_end_flush() 但它给了我一个空的 zip 文件。
  • 是的,ob_clean() 和 ob_end_flush() 解决了问题。
【解决方案3】:

您的完整脚本是什么样的?

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

【讨论】:

  • 感谢大卫的建议。我通常使用大量需要和 require_onced 的小脚本。我经历了整个过程,一次注释掉一个并确定了问题 - 信不信由你,这是因为在其中一个脚本中终止后不需要回车?>!
  • 乐于提供帮助 - 最好省略 ?> 因为它们最后不是必需的!
  • @karl-gjertsen 回答也有帮助
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多