如何为HTTP头编码UTF8文件名?(Python,Django)

2024-04-18 23:26:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我对HTTP头有问题,它们是用ASCII编码的,我想提供一个下载文件的视图,文件名可以是非ASCII的。

response['Content-Disposition'] = 'attachment; filename="%s"' % (vo.filename.encode("ASCII","replace"), )

我不想使用静态文件来处理非ASCII文件名的相同问题,但是在这种情况下,文件系统和它的文件名编码会有问题。(我不知道目标操作系统。)

我已经尝试过urllib.quote(),但它引发了KeyError异常。

也许我做错了什么,但也许这是不可能的。


Tags: 文件视图http编码attachment文件名responseascii
3条回答

请注意,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)。

相关问题 更多 >