下载链接在IE中失败
我在尝试实现一个“下载链接”,把它放在我的报告表旁边,这样用户就可以下载一个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 个回答
这段话虽然没有直接回答你的问题,但我希望能解决你最初遇到的麻烦。
我建议在链接到CSV文件的查询字符串中添加一个时间戳(也就是一个独特的标记)。这样做对我有帮助。
下载链接是用https(安全连接)吗?如果是的话,IE浏览器在设置为缓存时就无法处理下载。这是IE浏览器一个比较常见的问题。
我不太确定发送了什么缓存控制头,但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"');