【问题标题】:Problem with PHP readfile() dumping binary data to the browserPHP readfile() 将二进制数据转储到浏览器的问题
【发布时间】:2011-09-09 22:17:11
【问题描述】:

我试图通过浏览器强制下载这是我的代码:

header("Content-Type: application/force-download"); 
header('Content-type: audio/mp3');
header('Content-Description: File Download');
header('Content-Disposition: attachment; filename=' . $file_name);
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-length: ' . filesize($file_path);
ob_clean();
flush();
readfile($file_path);

这在我的本地机器上完美运行,但是当我将它上传到我的实时服务器时,二进制文件被转储到浏览器并且那些乱码字符填满了浏览器窗口。可能是什么问题呢?我在共享服务器上,所以我不知道我的 apache 配置是否需要更改。

我接受了@sanmi 的建议并使用 Firebug 查看响应标头,这就是我得到的结果:

Here is what I got sanmai: 
Server  nginx/0.7.67
Date    Tue, 06 Sep 2011 15:02:03 GMT
Content-Type    text/html; charset=UTF-8
Transfer-Encoding   chunked
Connection  keep-alive
Expires Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0   
Pragma  no-cache
Vary    Accept-Encoding,User-Agent
Content-Encoding    gzip

我可以看到内容类型条目已更改为 text/html,并且服务器实际上是 nginx 的。那么这是 nginx 问题还是我的标头条目错误?

谢谢, 世嘉

【问题讨论】:

  • 如果你在服务端注释了 ob_clean() 和 flush() ,会有什么反应?
  • 做到了,但还是同样的问题。

标签: php header readfile


【解决方案1】:

原来我包含的其中一个文件在结束 php 标记后有一个空行。就是这个问题,谢谢大家的帮助。

【讨论】:

  • 非常感谢。我有一个这样结束的包含文件: ... readfile($file);出口; } } ?>
    ----------------------- 现在结束如下: readfile($file);出口; } } ?> 并且完美运行。网页中不再有二进制符号! (非常感谢!!!)
【解决方案2】:

这里

header("Content-Type: application/force-download"); 
header('Content-type: audio/mp3');

您发送两个Content-Type,只需要一个。

【讨论】:

  • 没关系。第二个将覆盖第一个。
  • 因为他试图强制下载,所以覆盖很重要。
  • 它可能根本不会覆盖,因为“此功能现在可以防止一次发送多个标头,以防止标头注入攻击。” php.net/manual/en/function.header.php
  • 我理解这句话就像不可能做这样的事情header("Header-Y: Hello\nHEader-X: World");
  • 删除了带有音频/mp3的那个,试了还是不行。但它仍然可以在本地工作。
【解决方案3】:

我不确定这是否会导致它,但内容类型 audio/mp3 未定义(官方):http://www.iana.org/assignments/media-types/audio/index.html。尝试使用音频/mpeg?

【讨论】:

  • 我试过你的建议,但问题仍然存在。我猜它与服务器有关。
【解决方案4】:

使用 FireBug 或 other means 查看服务器实际发送的 HTTP 标头。它可能隐藏或改变其中任何一个。如果是这样,请与您的主机支持人员联系。

【讨论】:

  • 请将此添加到您的原始问题中。在我看来,您的托管服务器会吃掉所有这些标头。请与支持人员联系,我们无法在这里为您提供帮助。
  • 我使用了 FireBug,我看到响应头的 Content-Type: 已更改为 text/html;字符集=UTF-8。这不应该是正确的,我看到服务器是 nginx 服务器而不是 apache 服务器,这可能是问题吗?
  • 谢谢@sanmai,我真的怀疑,我在他们的知识库上读到了一些东西,他们使用负载平衡并且有特殊的标头信息或类似的东西,所以我会与他们核实。再次感谢。
猜你喜欢
  • 2011-12-04
  • 2011-02-17
  • 1970-01-01
  • 2021-01-03
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
相关资源
最近更新 更多