前段时间被某个前端小可爱鄙视了一下,说我博客都一年不更新了,我不服,明明还有俩月才到一年呢。不过说是这么说,还是要更新一下的。
以上都是借口,下面开始正文。
 
 
我公司的某个内部系统,用django做的,项目中不可避免地有下载文件的地方,以前偷懒,我都是用django自带的方法,在项目的总urls.py中使用

urlpatterns += static(FILEPATH, document_root=FILEPATH)
这种方法解决。
 
但是这种方法有个极大的缺陷:测试环境写着玩可以,正式环境肯定要把settings中的debug=True关掉的。而这种方法,在关掉debug之后,就不能用了。
 
于是我只好走传统线路:设置header。
 
在urls.py中增加:

url(r"^download/$", views.download, name="download")
在页面中:

<a href="{% url 'download' %}">下载</a>
在views.py中增加一个视图函数:

def download(request):
return build_download_response(FILE_PATH, "我爱可乐.docx")
(MTV模式的程咬金三板斧,没毛病)
 
由于系统里面不止一个地方用到下载功能,所以,我把它写成了一个通用的函数:

from django.http import FileResponse

def build_download_response(filepath, filename):
"""
构建下载文件的文件头
:param filepath: 文件路径
:param filename: 文件名
:return: FileResponse
"""
absname = os.path.join(filepath, filename) if os.path.isdir(filepath) else filepath response = FileResponse(open(absname, "rb"))
response["Content-Type"] = "application/octet-stream"
response["Content-Disposition"] = "attachment; filename='%s'" % filename
return response
参照网上的说法,这样是没问题的。蓝鹅,它确实出了问题:当我点击下载按钮的时候,弹出的界面只有“下载”二字。
 
 
喵喵喵?我的文件呢?
我尝试把文件下载下来看了一下,从大小来看,是没有问题的。
 
 
我把名字改过来,可以正常打开,里面没有丢东西——换句话说,只是文件名出了问题
可是文件名能有毛的问题啊?你不能欺负我公司的人只会中文吧!
 
 
 
经过一番激烈地百度和扣人心弦地搜索,我从这篇博客 https://blog.csdn.net/u011090495/article/details/18815777 里找到了原因。
简单点说就是,Content-Disposition里面的filename这个东西,原来不是RFC标准,仅支持ASCII编码的文件名。如果文件名不是英文的,恐怕就会出现名字乱码,或者被改名的情况。那么怎么办呢?另一个RFC给加上了扩展,可以定义一个filename*,然后把文件名编码一下。
于是,我把 Content-Disposition 这里从

response["Content-Disposition"] = "attachment; filename='%s'" % filename
改成了

response["Content-Disposition"] = "attachment; filename='%s'; filename*=UTF-8''%s" % (filename.encode("UTF-8"), filename.encode("UTF-8"))
结果测试了一下,哭了。
 
 
还真是编码了……
我要闹了。
 
还好,后来又在 https://segmentfault.com/q/1010000009078463 这篇帖子里找到了答案。原来 filename*=UTF-8''%s" % filename.encode("UTF-8") 这样写是不管用的,django自有django的方法:

from django.http import FileResponse
from django.utils.encoding import escape_uri_path def build_download_response(filepath, filename):
"""
构建下载文件的文件头
:param filepath: 文件路径
:param filename: 文件名
:return: FileResponse
"""
absname = os.path.join(filepath, filename) if os.path.isdir(filepath) else filepath response = FileResponse(open(absname, "rb"))
response["Content-Type"] = "application/octet-stream"
response["Content-Disposition"] = "attachment; filename*=UTF-8''{}".format(escape_uri_path(filename)) return response
于是,就可以正常下载了。
 
 
 
打开看看,内容完全没问题!
 
 
 
开心!(我才不会拿去给前端炫耀呢!)
 

python3中用django下载文件,中文名乱码怎么办?的更多相关文章

  1. [转]JSP或servlet中(以及上传下载文件)中文乱码或不显示的解决方案

    时间 2014-04-14 14:33:44  CSDN博客 原文  http://blog.csdn.net/xby1993/article/details/23677375 主题 ServletJ ...

  2. django下载文件

    赶快记录一下写的一个django下载文件的例子,以便以后复习: 在views.py中设置 from django.core.servers.basehttp import FileWrapper im ...

  3. PHP使用文件流下载文件方法(附:解决下载文件内容乱码问题)

    1.flush - 刷新输出缓冲 2.ob_clean - 清空(擦掉)输出缓冲区 此函数用来丢弃输出缓冲区中的内容. 此函数不会销毁输出缓冲区,而像 ob_end_clean() 函数会销毁输出缓冲 ...

  4. django 下载文件 无法正常打开

    下载文件,无法正常打开,如下图 需手动加后缀名修改文件格式方可正常打开进而能得知文件内容正常如下图,给“下载”文件加上后缀即可得到正常下载的内容 问题整理:(此下载功能采用StreamHttpResp ...

  5. HttpWebRequest下载文件,乱码问题解决方案

    写在前面 今天之所以会总结HttpWebRequest下载文件,主要是因为在使用该类下载文件的时候,有些地方需要注意一下,在实际的项目中遇到过这种问题,觉得还是有必要总结一下的.在下载文件时,最常见的 ...

  6. 火狐浏览器下载文件中文乱码,文件名中的空格变加号("+")的问题

    解决一下问题: 1.火狐浏览器下载文件,中文变乱码 2.IE浏览器下载文件,丢失文件扩展名或强制扩展名为".txt" 3.浏览器下载文件,文件名中的空格变成加号("+&q ...

  7. 关于TomCat上传文件中文名乱码的问题

    最近在学习TomCat文件上传这一部分,由于文件上传必须要三个条件: 1.表单提交方式必须为Post 2.表单中需要有<input type="file">元素,还需要 ...

  8. 关于commons-fileupload组件上传文件中文名乱码问题

    java web开发,常用到的文件上传功能,常用的commons-fileupload和commons-io两个jar包.关于如何使用这两个jar来完成文件上传的功能,这里不做详解.使用commons ...

  9. java压缩文件中文名乱码问题

    import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; 改为 import org.apache.tools.zip. ...

随机推荐

  1. learning rate warmup实现

    def noam_scheme(global_step, num_warmup_steps, num_train_steps, init_lr, warmup=True): ""& ...

  2. Elastic 使用索引生命周期管理实现热温冷架构

    Elastic: 使用索引生命周期管理实现热温冷架构 索引生命周期管理 (ILM) 是在 Elasticsearch 6.6(公测版)首次引入并在 6.7 版正式推出的一项功能.ILM 是 Elast ...

  3. 宣布Visual Studio Code Installer for Java

    自从第一个Java语言服务器在微软苏黎世办公室的一个小型会议室的黑客马拉松中开发已经差不多3年了,该会议室的人员来自Red Hat,IBM,Codenvy和Microsoft,后来成为Visual S ...

  4. 3-美团 HTTP 服务治理实践

    参考: 美团 HTTP 服务治理实践 Oceanus:美团HTTP流量定制化路由的实践

  5. Java生鲜电商平台-积分,优惠券,会员折扣,签到、预售、拼团、砍价、秒杀及抽奖等促销模块架构设计

    Java生鲜电商平台-积分,优惠券,会员折扣,签到.预售.拼团.砍价.秒杀及抽奖等促销模块架构设计 说明:本标题列举了所有目前社会上常见的促销方案,目前贴出实际的业务运营手段以及架构设计,包括业务说明 ...

  6. Lucene搜索核心代码TermInfosReader

    TermInfosReader类是Lucene搜索的核心代码,所有的搜索最终都是落到通过term查询,TermInfosReader里定义了支持的基础的term查询功能. 前置知识: 词元字典文件(t ...

  7. DOIS2019大会,腾讯 DevOps 测试中台探秘

    WeTest 导读 腾讯WeTest受邀参加2019年DevOps 国际峰会,由WeTest产品负责人-殷柱伟老师分享了腾讯DevOps测试中台的实践经验与心得, 议题受到了现场听众及行业媒体的关注与 ...

  8. 轻量级手绘软件openCanvas免费版,手绘板CG手绘软件

    轻量级手绘软件openCanvas免费版,手绘板CG手绘软件 手绘软件通俗一点来说就是用手来绘画的软件,应用很宽泛如建筑,服饰陈列设计.橱窗设计.家居软装设计.空间花艺设计.美术.园林.环艺.摄影.工 ...

  9. Telegram Android源码问题汇总 持续更新

    libtgvoip目录为空 git clone下来的工程中带有submodule时,submodule的内容没有下载下来,执行如下命令 cd Telegram git submodule update ...

  10. 还学不会webpack?看这篇!

    摘要: webpack入门教程. 原文:还学不会webpack?看这篇! 作者:MudOnTire Fundebug经授权转载,版权归原作者所有. Webpack已经流行好久了,但很多同学使用webp ...