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

发布于 2022-09-05 01:08:50 字数 308 浏览 8 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

情话墙 2022-09-12 01:08:51

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

在后台把文件名先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编码的中文输出
孤千羽 2022-09-12 01:08:51

我也遇到了这个问题,在网上搜到的答案是HTTP的header只支持ASCII,要将content-disposition的值转换成ASCII,像下面这样:

response = HttpResponse(content_type='application/vnd.ms-excel')
str = 'attachment; filename=中文表名.xls'
response['Content-Disposition'] = str.encode('utf-8', 'ISO-8859-1')

至于后面为何要加ISO-8859-1我就不清楚了。

_蜘蛛 2022-09-12 01:08:50

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

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上测试过了,运行正确,别的浏览器就不清楚了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文