Django中设置Content-Disposition保存中文命名的文件

django开发导出数据库的一些数据生成excel表格的功能,关键代码如下:

filename = timezone.now().strftime("%Y%m%d")+'.xls'
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename=' + filename

其中用英文数字的文件名如a2017.xls,浏览器显示正常,但是用了中文后,就是默认的文件名,如下载.xls

阅读 11k
3 个回答

我使用了这段代码,文件名成功显示了中文。

from django.utils.encoding import escape_uri_path
from django.http import HttpResponse
def test(request):
    file_name = '测试.txt'
    content = ...
    response = HttpResponse(content, content_type='application/octet-stream')
    response['Content-Disposition'] = "attachment; filename*=utf-8''{}".format(escape_uri_path(file_name))
    return response

注:我在Firefox和Chrome上测试过了,运行正确,别的浏览器就不清楚了。

原因是不同浏览器对于下载文件文件名的编码解析格式不一样

在后台把文件名先encode成bytes,再判断浏览器,根据不同的浏览器用相应的编码decode一下就好了
例如浏览器是ff,后台编码是utf-8
response['Content-Disposition'] = 'attachment; filename=' + filename.encode('utf-8).decode('ISO-8859-1')
就ok了

常用浏览器解析格式。

  1. IE浏览器,采用URLEncoder编码
  2. Opera浏览器,采用filename*方式
  3. Safari浏览器,采用ISO编码的中文输出
  4. Chrome浏览器,采用Base64编码或ISO编码的中文输出
  5. FireFox浏览器,采用Base64或filename*或ISO编码的中文输出
宣传栏