下载链接在IE中失败

6 投票
3 回答
1368 浏览
提问于 2025-04-15 17:37

我在尝试实现一个“下载链接”,把它放在我的报告表旁边,这样用户就可以下载一个csv文件,然后用像Excel这样的应用程序打开它。

这些记录是根据用户的查询动态生成的。

所以在我的控制器里,有类似这样的代码:

response.headers['Content-Type'] = 'text/csv'
response.headers['Content-Disposition'] = 'attachment; filename=xxx.csv'
return response.stream(dynamically_generated_csv, request=request)

这个在火狐和谷歌浏览器上都能正常工作,但在IE浏览器上就不行。

当我打印出响应头时,发现web2py给我的响应添加了几个头信息,比如'Expires'、'Cache-Control'等等……

然后当我通过以下方式去掉'Cache-Control'头信息时:

del response.headers['Cache-Control']

在IE上就能正常工作了。

所以看起来IE在处理带有特定'Cache-Control'值的可下载文件时会遇到问题。

现在,我的问题是:

  • 为什么web2py会隐式地添加这些响应头?而且可能没有办法去掉它们?

  • 以这种方式删除'Cache-Control'头信息会有什么副作用吗?

谢谢大家的帮助。

3 个回答

0

这段话虽然没有直接回答你的问题,但我希望能解决你最初遇到的麻烦。

我建议在链接到CSV文件的查询字符串中添加一个时间戳(也就是一个独特的标记)。这样做对我有帮助。

2

下载链接是用https(安全连接)吗?如果是的话,IE浏览器在设置为缓存时就无法处理下载。这是IE浏览器一个比较常见的问题。

5

我不太确定发送了什么缓存控制头,但IE在下载文件时确实有个bug,就像你遇到的那样。

对于IE,你必须启用缓存。当IE加载文件(比如Excel文件)时,它会从缓存目录中加载这些文件,所以如果你不进行缓存,Excel(或者其他应用)就无法加载这个文件。

Eric Law(微软)对此话题的看法:http://blogs.msdn.com/ieinternals/archive/2009/10/02/Internet-Explorer-cannot-download-over-HTTPS-when-no-cache.aspx

更新:不过,如果你只是想强制下载... 比如不想让IE在窗口中加载Excel文件... 那么一定要设置完整的附件头信息。

//PHP style
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="downloaded.pdf"');

撰写回答