Flask 下载中文名文件
在写 flask 后端的时候,特别是在做数据相关的操作的时候,产品往往需要我们做一个导出数据的需求,一般都是导出 excel 格式的文件。
那在 flask 上,如何实现请求连接即可让浏览器下载呢?有两种思路。
一:
文件在本地磁盘,这时候我们只需要发送相应的地址过去即可。
二:
通过 io 中的 BytesIO, 把文件以二进制的形式发送过去,这里我们需要使用 flask 自带的 send_file。
第一种的坏处在于不便于权限控制,拿到下载链接在哪都能下载,第二种方法的缺陷在于只能接收 get 请求,post 请求发送的文件浏览器是不能识别的。
要实现 send_file, 是很容易的, 代码如下(适用于 python 3):
import xlsxwriter
from io import BytesIO
from flask import Flask, send_fileapp = Flask(__name__)@app.route("/download", methods=["GET"])
def download():out = BytesIO()workbook = xlsxwriter.Workbook(out)table = workbook.add_worksheet()table.write(0, 0, "name")table.write(0, 1, "age")workbook.close()out.seek(0)return send_file(out, as_attachment=True, attachment_filename="dream.xlsx")if __name__ == "__main__":app.run(debug=True)
这是一个完整的后端程序,能够直接跑起来。
其中我们用到了 xlsxwriter 这个库,用来生成一个 excel 文件, 直接传给 BytesIO() 成数据流的形式发出去,浏览器接收到这些数据流,回自动进行下载,文件名即是 send_file 参数中的 attachment_filename, 在我们这里便是 dream.xlsx 。
启动程序,在浏览器中输入 127.0.0.1:5000/download, 即可下载名为 dream.xlsx 的文件。
我们打开看看:
的确是我们生成的一个 excel 表格。
现在问题来了,这里的文件名是英文的,那我们需要中文怎么办?直接把 attachment_filename 参数改成 attachment_filename="测试表格.xlsx"可以么?
我们来试试:
return send_file(out, as_attachment=True, attachment_filename="测试表格.xlsx")
其余代码不变,仅有此处发成改变。
运行代码,浏览器访问下载试试。
浏览器没有任何反应,代表我们没有把数据流传给它,看程序,也报错了,报错信息:
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 43-46: ordinal not in range(256)
编码问题。
解决办法如下:
import xlsxwriter
from io import BytesIO
from flask import Flask, send_file
from urllib.parse import quoteapp = Flask(__name__)@app.route("/download", methods=["GET"])
def download():out = BytesIO()workbook = xlsxwriter.Workbook(out)table = workbook.add_worksheet()table.write(0, 0, "name")table.write(0, 1, "age")workbook.close()out.seek(0)filename = quote("测试表格.xlsx")rv = send_file(out, as_attachment=True, attachment_filename=filename)rv.headers['Content-Disposition'] += "; filename*=utf-8''{}".format(filename)return rvif __name__ == "__main__":app.run(debug=True)
我们从 urllib.parse 引入 quote, 首先对文件名进行编码,然后 send_file 中 作为 attachment_filename 的参数,这时候能成功下载文件,但是文件名是编码后的名字,要解码的话,我们需要在 headers 里面声明编码格式,即:
rv.headers['Content-Disposition'] += "; filename*=utf-8''{}".format(filename)
这样的话,对文件名进行 UTF-8 解码,我们的文件名就是中文了。
如图:
打开文件,也是我们想要的,如图:
大功告成!
当然实际生产工作中,数据量是是非常大的,生成 excel 文件将会特别耗时,我们当然不希望我们的程序在此堵塞, 这时候我们可以使用 celery 异步任务,返回前端一个任务 ID, 前端去轮询这个任务 ID,当文件生成好了,即可开始下载。
由于有些时候我们 get 请求无法满足我们的参数传递,比如有多个嵌套对象作为参数传递,我们必须使用 post 请求,这时候同样可以采用 celery 异步任务的方式,返回任务 ID, 轮询任务状态,下载文件。
之后我会写一篇教程,celery 异步任务。
Flask 下载中文名文件相关推荐
- django下载 中文名 文件
Django下载中文名文件: the_file_name = "中文名.abc" response = HttpResponse(stream) response['Content ...
- flask下载excel文件
flask提供了send_from_directory方法来下载文件,使用很方便,但是在下载的文件名中包含中文就会出问题. 修改之前的代码: send_from_directory(dir_path, ...
- 经验分享2-火狐浏览器下载中文名文件乱码解决办法
由于火狐文件中文解码的问题显示的乱码,解决方法如下: 第一步:在右上角菜单栏处找到附加组件 第二步,选择拓展组件,搜索"下载文件编码",下载安装第一个插件 第三步,安装后在右上角有 ...
- 使用FPT上传下载文件和解决中文名文件乱码问题
项目中从ftp服务器下载上传文件是一个经常用到的,下面是个人在用到的时候的一些学习记录. 为了方便,我在本地装了FileZilla Server,在本地搭建了一个ftp服务器. 先看一个简单的代码 i ...
- 苹果手机上下载的文件在哪里?
(图文无关) 昨天在微信收到一个大文件,73M,突然意识到,微信升级,终于冲过了30M的文件传输限制.接下来的问题,这是一个开发工程文件,要在电脑开发环境使用,怎么把这个文件传输到电脑? 正常的方式是 ...
- Android 通过FTP方式下载服务器文件
Android中大多数情况都是通过http请求后台数据,这种方式会有很多网络请求框架,现在有个需求是通过请求FTP服务器下载文件,那些经常用到的网络框架都用不了了,接下来我就来实现Android访问F ...
- java 下载txt文件(页面代码+Java后台代码+下载工具类)
需求:页面有一个下载按钮,当点击下载的时候将页面表单数据下载到成为txt文件,并在网页直接下载该文件 1.页面(html) 下载一定要通过form表单的方式,js的ajax函数的返回类型只有xml.t ...
- php下载.xlsx,php下载excel文件
php下载指定路径的excel代码: $download_path = ROOT_PATH.'admin/download/'; $filename2 = "库存明细(含有效期).xls&q ...
- 解决Http或Https中下载中文文件乱码和无法下载问题
一.解决无法下载中文文件问题 在下载时,经常通过url方式链接到指定文件路径的方式进行下载文件,但是如果文件含有中文时,往往出现http 404 无法找到文件的错误,原因就是文件中包含中文的问题,因此 ...
- [Linux] Linux 客户端NFS挂载后目录下中文名文件乱码
0x0 场景 服务端:Windows 2008R2 NFS共享目录D:/TEST 客户端:Linux/Centos 7.5 Centos 7.5 客户端NFS挂载 Windows2008R2 共享目录 ...
最新文章
- Android 中的 Service 全面总结(转)
- 6.最小角回归(Least Angle Regression)
- maven国内镜像(maven下载慢的解决方法)
- OpenVINO InferenceEngine 之Grap file
- jdk1.8新特性的应用-Stream 的终止操作
- centos 7.4 + postgresql 10.1 + pg_amqp
- LeetCode939
- 远程控制软件 mRemoteNG,管理多台虚拟机
- 火狐浏览器_全球知名度非常高的火狐浏览器,它好在哪呢?
- linux安全策略加固文档_系统加固之Linux安全加固
- 练习 P1957 口算练习题
- gatk过滤_GATK--使用转载
- Windows 10 解决无法完整下载安装语言包(日语输入法无法下载使用)
- vite:vue中引入图片报错require is not defined
- 程序 多核优化 linux,linux 多核CPU性能调优
- html响应式布局ipad,响应式布局(Responsive design)
- 计算机一级excel中模拟运算,2017年计算机一级《MS Office》操作试题及答案
- python去掉两边空格,Python去除字符串两端空格的方法
- 【C语言】循环语句(do while循环)
- stm32f302实现斩波控制步进电机_[转载]步进电机原理介绍与基于STM32的SPWM驱动步进电机,使用软件实现电机细分...