在响应头中添加 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)