我对HTTP头有问题,它们是用ASCII编码的,我想提供一个下载文件的视图,文件名可以是非ASCII的。
response['Content-Disposition'] = 'attachment; filename="%s"' % (vo.filename.encode("ASCII","replace"), )
我不想使用静态文件来处理非ASCII文件名的相同问题,但是在这种情况下,文件系统和它的文件名编码会有问题。(我不知道目标操作系统。)
我已经尝试过urllib.quote(),但它引发了KeyError异常。
也许我做错了什么,但也许这是不可能的。
请注意,2011年,RFC 6266(特别是附录D)对此问题进行了讨论,并提出了具体建议。
也就是说,您可以只使用ASCII字符发出
filename
,然后使用RFC 5987格式的文件名发出filename*
,供理解它的代理使用。通常这看起来像
filename="my-resume.pdf"; filename*=UTF-8''My%20R%C3%A9sum%C3%A9.pdf
,其中Unicode文件名(“My Résumé.pdf”)编码为UTF-8,然后是百分比编码(注意,不要对空格使用+
)。请确实阅读RFC 6266和RFC 5987(或者使用一个健壮的、经过测试的库来为您抽象这些内容),因为我在这里的总结缺乏重要的细节。
不要在内容配置中发送文件名。无法使非ASCII头参数跨浏览器(*)工作。
相反,只发送“Content Disposition:attachment”,并将文件名保留为URL编码的UTF-8字符串,放在URL的尾部(PATH_INFO),以便浏览器在默认情况下获取和使用。浏览器对UTF-8url的处理要比处理内容更可靠。
(*:实际上,目前甚至没有一个标准规定它应该如何完成的工作,因为rfc2612231和2047之间的关系非常不正常,Julian正试图在规范级别上澄清这一点。一致的浏览器支持是在遥远的将来。)
这是一个常见问题。
没有可互操作的方法可以做到这一点。一些浏览器实现了专有扩展(IE、Chrome),另一些实现了RFC 2231(Firefox、Opera)。
请参阅http://greenbytes.de/tech/tc2231/上的测试用例。
更新:截至2012年11月,所有当前桌面浏览器都支持RFC 6266和RFC 5987中定义的编码(Safari>;=6,IE>;=9,Chrome,Firefox,Opera,Konqueror)。
相关问题 更多 >
编程相关推荐