flask下载文件中文名乱码终极解决方案python3版本

flask(0.11.2)+python3.6

  • 兼容各个主流浏览器,已经过各种测试(chrome,firefox,safari,IE,Edge)
  • quote是将文件名urlencode化,然后以适应Edge浏览器
from urllib.parse import quote  # for python3
# from urllib import quote for python2
@app.route(‘/file/download/<filename>‘, methods=[‘GET‘])
def file_download(filename):
    filename=FILE_PATH+filename
    response = make_response(send_file(filename)) #
    basename = os.path.basename(filename)
    utf_filename=quote(basename.encode(‘utf-8‘)
    response.headers["Content-Disposition"] = "attachment;filename*=UTF-8‘‘{}".format(utf_filename)
    response.headers[‘Content-Type‘] = "application/octet-stream; charset=UTF-8"
    return response
"""
Content-Disposition中的filename进行了两次URL转码。以汉字漫为例:

第一次转码,漫变为%E6%BC%AB。
第二次转码,%E6%BC%AB变为%25E6%25BC%25AB(第二次转码时,因为%是特殊字符,所以会转为%25)。
前端下载时:

Chrome浏览器可以自动执行两次URL解码,所以下载的文件名是正常的。
IE浏览器只执行一次URL解码,所以下载的文件名是第一次编码的结果(%E6%BC%AB)(版本8,10验证问题存在)。
火狐好像也不行。
解决方案是在返回给前端前对Content-Disposition中的filename先进行一次URL解码(实际我是对filename这个参数进行了解码,因为文件服务器是用的第三方的。)。

此外,当文件名为中文(未执行URL编码)字符串时,IE下载也为乱码,因为IE对中文字符串又执行了一次URL解码。解决方案是将中文字符串进行URL编码。

所以,总结下来,关键的问题就在于IE浏览器对filename只进行一次解码,而chrome对这种情况是进行了优化的
"""

原文地址:https://www.cnblogs.com/onemorepoint/p/9559073.html

时间: 2024-08-02 21:25:51

flask下载文件中文名乱码终极解决方案python3版本的相关文章

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

写在前面 今天之所以会总结HttpWebRequest下载文件,主要是因为在使用该类下载文件的时候,有些地方需要注意一下,在实际的项目中遇到过这种问题,觉得还是有必要总结一下的.在下载文件时,最常见的就是下载的文件出现乱码. 一个例子 还是以前面介绍的restful接口为例吧,现在我要通过HttpWebRequest请求,来下载图片,可以这样来. api地址为:http://localhost:21074/ImageService/api/1.jpg 关于restful imageservice

从服务器下载文件中文名乱码解决方法

try { string excelName = Request["excelName"].ToString(); //文件路径 string fileName = Request["fileName"].ToString(); //下载的文件名 if(!(string.IsNullOrEmpty(excelName)|| string.IsNullOrEmpty(fileName))) { Response.Charset = "GB2312"

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

时间 2014-04-14 14:33:44  CSDN博客 原文  http://blog.csdn.net/xby1993/article/details/23677375 主题 ServletJSP JSP或servlet中中文乱码的解决方案: 1.以POST请求方式: 在获取请求参数之前设置: request.setCharacterEncoding("utf-8"); 设置输出编码: response.setContentType("text/html;charse

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

记得高中时候做过游戏私服,那时候的游戏主页是用PHP写的,因为文件很固定,客户端,登陆器和一些小工具,文件数目也不是很多,所以都是直接把下载链接写死的,直接链接到本地服务器的文件目录,今天QQ群有个朋友突然问我用文件流做PHP下载功能,顺手写了个小Demo,代码很简单,注释也全,直接上代码吧~ 1.flush — 刷新输出缓冲 2.ob_clean — 清空(擦掉)输出缓冲区 此函数用来丢弃输出缓冲区中的内容. 此函数不会销毁输出缓冲区,而像 ob_end_clean() 函数会销毁输出缓冲区.

文件下载(解决下载文件文件名乱码)

不同浏览器下载文件时会出现文件名乱码问题,根据请求浏览器类型处理文件名.

Java web中不同浏览器间导出Excel文件名称乱码问题解决方案

问题描述: 对于不同浏览器存在对中文编码格式问题,从而在导出Excel文件时,中文文件名出现乱码的情况,即在程序中给要导出的文件指定一个中文名字时,在浏览器上出现的下载框中的文件名出现了乱码,解决如下: 解决方案: [java] view plain copy Date dt=new Date();//如果不需要格式,可直接用dt,dt就是当前系统时间 DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");//设置显示格

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

import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; 改为 import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; ant包里提供ZipOutputStream类的setEncoding("gbk")方法. zos.setEncoding("gbk"); ant包下载(点击进

HttpServlet 下载图片中文名乱码问题

项目中用到下载图片,发现带中文图片名称有乱码问题,须将文件名进行URLEncode转码后,方可解决,特此记录 1.图片位置,例子名字命名为中文图片名.jpg. 2.web.xml 事例 <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-ap

在使用flask下载文件时会出现的一个文件下载不到的问题

from flask import send_from_directory @app.route('/uploads/<filename>') def uploaded_file(filename):     return send_from_directory(app.config['UPLOAD_FOLDER'],                                filename)                                 genericpath.py