IE 11无法正确解析HTTP Content Disposition标头

时间:2016-05-16 11:22:03

标签: python utf-8 internet-explorer-11 content-disposition

我正在尝试设置Content Disposition标头,以便在IE 11中执行文件下载时获取自定义文件名。

我在IE 11中遇到了非常奇怪的行为:当内容处置标题IE 11的文件名中存在转义(U + 001B)字符时,IE 11无法设置正确的文件名(在内容处理标题中提供)。例如,格式为content_disposition的{​​{1}}会触发IE 11错误,但使用file_name_1进行格式设置很好:

file_name_2

是否有任何方法可以在IE11中提供任何utf8文件名的支持。

注意:在所有其他浏览器中,一切似乎都运行正常,我希望有办法在不破坏其他浏览器的情况下修复IE 11的行为......

2 个答案:

答案 0 :(得分:2)

不接受这些字符实际上是规范推荐的内容。见https://greenbytes.de/tech/webdav/rfc6266.html#rfc.section.4.3.p.5

“收件人应该剥离或替换已知会在用户界面和文件名中引起混淆的字符序列,例如控制字符和前导和尾随空格。”

当然有人可能会争论保留其余字符会有什么好处,但重要的是建议用户代理剥离控制字符。

答案 1 :(得分:1)

建议在形成内容处置标题之前去除控制字符(@JulianReschke答案中的更多信息)。

python中的

Control codes可以使用list comprehensionord轻松删除:

# There are invisible control character escape (U+001B)
name = u'_$B!'
# All chars with ord(s) <= 31 is a control characters.
name = "".join(i for i in name if ord(i) > 31)

因此,在将代码添加到代码之后,一切都开始正常工作:

name = u'_$B!'
# Strip control codes
name = "".join(i for i in name if ord(i) > 31)

file_name_1 = quote(name) # gives "_%1B%24B%21"
file_name_2 = "_%24B%21.pdf"
content_disposition = "attachment; filename*=utf-8''%s" % file_name_2