强制文件下载已损坏

时间:2012-03-30 14:24:58

标签: php file download corruption

我的网站上有一个文件下载代码,工作完全正常,直到我更改域名。 我检查了所有链接并更改了所有内容,然后才能使用 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 工作很好。如果我回显网址并尝试浏览它,我会看到该文件。

有人帮忙吗?

修改 我注意到浏览器说:资源被解释为Document但是使用MIME类型image / png

传输

1 个答案:

答案 0 :(得分:2)

如果正在下载的文件是图像(如评论中所述),那么Content-Type标题应该是该图像的适当mime类型,例如。 “image / jpeg”,“image / png”等。

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

“application / octet-stream”不应该在这个实例中使用(过去常用于尝试强制下载,因为浏览器不一定知道如何处理它)。 “Content-Disposition:attachment”标题是触发下载的内容。

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

修改#1

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

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

编辑#2 - 内容类型

在您链接到建议使用application/octet-stream instead of image/jpg的其他问题的答案之后......问题中的答案引用了RFC 2616,然而,这已经被RFC 6266取代了规定:

  

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

因此,为图像指定正确的mime类型更为正确(如上所述)。虽然,在一天结束时,重要的是什么对您有用,因为服务器/浏览器确实有所不同,并且不一定不一定遵循标准。

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

What could keep Chrome from downloading files?