【问题标题】:Forced file download iscorrupted强制文件下载损坏
【发布时间】:2012-03-30 14:24:58
【问题描述】:

我的站点中有一个文件下载代码,在我更改域之前它运行良好。 我检查了所有链接并更改了所有内容,它们可以正常工作FINE 然而由于某种原因,下载的文件已损坏,我不知道为什么。

代码:

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.$fileName.'"');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_url));
readfile($file_url);
exit;

$FileName 具有名称 + 扩展名。 $file_url 工作很好。如果我回显 url 并尝试浏览它,我会看到该文件。

有人帮忙吗?

编辑: 我注意到浏览器说:资源解释为文档,但使用 MIME 类型图像/png 传输

【问题讨论】:

  • 你用参数和东西调用你的 PHP 文件吗?
  • 是的,我使用 GET,但这段代码运行了大约一周...我尝试将标题放在顶部...
  • 查看文件内部(十六进制编辑器或其他):是否有例如 php 错误/警告?
  • 正在下载的文件的实际 MIME 类型是什么?通常将此指定为 Content-Type,而不是八位字节流,因为 Content-Disposition 标头是控制下载的内容。
  • @KingCrunch 这不是针对特定文件,我使用此代码下载许多文件,并且所有文件都会发生这种情况。

标签: php file download corruption


【解决方案1】:

如果正在下载的文件是图像(如 cmets 中所述),则 Content-Type 标头应该是该图像的适当 mime 类型,例如。 “图像/jpeg”、“图像/png”等

$size = getimagesize($file_url);
header("Content-type: {$size['mime']}");

在这种情况下不应使用“application/octet-stream”(过去经常用于尝试强制下载,因为浏览器不一定知道如何处理它)。 “Content-Disposition: attachment” 标头是触发下载的原因。

另外,您提到原始文件名是希伯来语...“filename=”标头应以 US-ASCII 格式指定文件名以实现兼容性。 UTF-8 是可能的,但只有一些额外的“乱七八糟”,并且仍然可能与某些浏览器不兼容。

编辑#1

如果您正在使用输出缓冲,那么在尝试下载文件之前,您可能需要确保输出缓冲区为空并刷新,否则输出缓冲区中的任何内容都将成为您下载文件的一部分并被损坏。

header('Content-Length: ' . filesize($file_url));
ob_clean();    // <<<<
flush();       // <<<<
readfile($file_url);

EDIT#2 - 内容类型

按照您对建议使用application/octet-stream instead of image/jpg 的其他问题的答案的链接...该问题中的答案引用RFC 2616,但是,这已被RFC 6266 取代,其中指出:

根据 RFC 2616,处置类型“附件”仅适用 到“application/octet-stream”类型的内容。这个限制有 被删除,因为实际上收件人不检查内容 类型,并且它也不鼓励正确声明媒体类型。

因此,为图像指定正确的 mime-type 更为正确(如上所述)。尽管归根结底,重要的是什么对您有用,因为服务器/浏览器确实各不相同,不幸的是不一定遵循标准。

要进一步支持指定正确的 mime 类型而不使用“application/octet-stream”的论点,请参阅以下已接受的对网站管理员问题的回答...

What could keep Chrome from downloading files?

【讨论】:

  • 你下载了 something 吗?这与标头中的 filesize() 有何不同?使用浏览器开发者工具检查发送到浏览器的响应头......它们是否匹配,服务器添加的任何额外内容?你在使用输出缓冲吗?
  • 我正在下载文件,只是打不开。
  • 我现在意识到浏览器会抛出错误(不知道我怎么没早点注意到它,抱歉):资源解释为文档,但使用 MIME 类型图像/png 传输:
  • 你用的是什么浏览器?我认为这只是告诉您它已损坏,但是为什么...您使用浏览器来显示图像? (使用“application/octet-stream”你不会得到错误 - 但这不会解决任何问题。)
  • 实际上,由于这篇文章,我尝试回到八位字节流:stackoverflow.com/questions/5648967/force-download-image,但它仍然发生了。我正在使用 Chrome,但我没有在浏览器中显示图像。当我按下下载按钮时,我看到了警告
猜你喜欢
  • 2013-03-31
  • 2012-12-05
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
相关资源
最近更新 更多