编程语言
首页 > 编程语言> > php – IE6中的文件下载

php – IE6中的文件下载

作者:互联网

我遇到了一个与IE6相关的相当令人沮丧(并且令人沮丧)的问题.我们正在提供一些服务器生成的pdf,然后简单地在PHP中设置标头以强制浏览器下载该文件.工作正常和所有,除了IE6,但仅当Windows用户帐户设置为标准用户(即非管理员).

由于这是针对企业环境的,当然所有帐户都是以这种方式设置的.奇怪的是,在下载对话框中,无法识别Content-Type:

header( 'Pragma: public' );
header( 'Expires: 0' );
header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );
header( 'Cache-Control: public' );
header( 'Content-Description: File Transfer' );
header( 'Content-Type: application/pdf' );
header( 'Content-Disposition: attachment; filename="xxx.pdf"' );
header( 'Content-Transfer-Encoding: binary' );
echo $content;
exit;

我还尝试首先将文件内容写入临时文件,因此我也可以在标题中设置Content-Length,但这没有帮助.

解决方法:

这些标题是假的!

Content-Transfer-Encoding: binary

此标头是从电子邮件标头中复制的.它不适用于HTTP,因为HTTP没有任何其他传输模式而不是二进制.设置它与设置X-Bits-Per-Byte一样有意义:8.

Cache-control: pre-check=0, post-check=0

这些非标准值定义IE何时应检查缓存的内容是否仍然是新鲜的. 0是默认值,因此将其设置为0会浪费时间.这些指令仅适用于可缓存内容,而Expires:0和必须重新验证提示您希望使其不可缓存.

Content-Description: File Transfer

这是另一个电子邮件模仿.根据设计,此标头不会以任何方式影响下载.这只是信息丰富的自由格式文本.它在技术上和X-Hi-Mom一样有用:我发给你一个文件!头.

header( 'Cache-Control: must-revalidate, pre-check=0, post-check=0' );
header( 'Cache-Control: public' );

在PHP第二行完全覆盖第一行.你似乎在黑暗中刺伤.

真正有用的是什么

Content-Disposition: attachment

您不必在那里插入文件名(您可以使用mod_rewrite或index.php / fakefilename.doc技巧 – 它为特殊字符提供了更好的支持,并且在忽略可选Content-Disposition标头的浏览器中工作).

在IE中,文件是否在缓存中是不同的(“打开”不适用于不可缓存的文件),以及用户是否具有声称支持IE检测到的文件类型的插件.

要禁用缓存,您只需要缓存控制:无缓存(没有20个额外的伪标头),并且为了使文件可缓存,您不必发送任何内容.

注意:PHP有一个可怕的错误称为session.cache_limiter,除非你把它设置为none,否则它会毫无希望地搞砸HTTP头.

ini_set('session.cache_limiter','none'); // tell PHP to stop screwing up HTTP

标签:php,download,internet-explorer-6
来源: https://codeday.me/bug/20190724/1520757.html