如何为 HTTP 标头编码 UTF8 文件名? (蟒蛇,姜戈)

新手上路,请多包涵

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

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

我不想使用静态文件来解决非 ASCII 文件名的相同问题,但在这种情况下,文件系统及其文件名编码会出现问题。 (我不知道目标操作系统。)

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

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

原文由 Chris Ciesielski 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 585
2 个回答

这是一个常见问题解答。

没有可互操作的方法来执行此操作。一些浏览器实现专有扩展(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)。

原文由 Julian Reschke 发布,翻译遵循 CC BY-SA 3.0 许可协议

不要在 Content-Disposition 中发送文件名。无法使非 ASCII 标头参数跨浏览器工作 (*)。

相反,只发送“Content-Disposition: attachment”,并将文件名作为 URL 编码的 UTF-8 字符串保留在 URL 的尾部 (PATH_INFO) 部分,以便浏览器默认获取和使用。与 Content-Disposition 相比,浏览器处理 UTF-8 URL 的可靠性要高得多。

(*:实际上,甚至没有一个当前标准说明 应该 如何完成,因为 RFC 2616、2231 和 2047 之间的关系非常不正常,Julian 正试图在规范级别上澄清这一点。一致的浏览器支持是在遥远的未来。)

原文由 bobince 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题