Django 返回流文件时使用中文文件名的问题

最近有一个需求,需要根据请求参数,从数据库获取指定数据动态生成 Excel 表格文件,并以流的形式返回。

在测试的过程中发现了一个问题,无论我怎么在响应头中添加 Content-Disposition 指定文件名,在 Chrome 浏览器中访问的时候返回的文件名始终是按 url 的最后一段自动生成的文件名,而将文件名改成英文以后又是正常的。

猜测应该是字符串编码的问题,http 响应头中字符应该按照 url 百分号编码。

修改为以下代码后,终于能够正常显示中文文件名了。

# Python3
from urllib.parse import quote
...
response['Content-Disposition'] = 'attachment; filename={0}.xlsx'.format(quote(filename))

Python2 中的 quote 方法引入位置有所不同,代码如下:

# Python2
from urllib import quote
...
# 向下兼容 Python2.6 以前的格式化字符串
response['Content-Disposition'] = 'attachment; filename=%s.xlsx' % quote(filename)

发表评论

电子邮件地址不会被公开。