我正在尝试设置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的行为......
答案 0 :(得分:2)
不接受这些字符实际上是规范推荐的内容。见https://greenbytes.de/tech/webdav/rfc6266.html#rfc.section.4.3.p.5:
“收件人应该剥离或替换已知会在用户界面和文件名中引起混淆的字符序列,例如控制字符和前导和尾随空格。”
当然有人可能会争论保留其余字符会有什么好处,但重要的是建议用户代理剥离控制字符。
答案 1 :(得分:1)
建议在形成内容处置标题之前去除控制字符(@JulianReschke答案中的更多信息)。
python中的Control codes可以使用list comprehension和ord轻松删除:
# 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