在写 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 下载中文名文件相关推荐

  1. django下载 中文名 文件

    Django下载中文名文件: the_file_name = "中文名.abc" response = HttpResponse(stream) response['Content ...

  2. flask下载excel文件

    flask提供了send_from_directory方法来下载文件,使用很方便,但是在下载的文件名中包含中文就会出问题. 修改之前的代码: send_from_directory(dir_path, ...

  3. 经验分享2-火狐浏览器下载中文名文件乱码解决办法

    由于火狐文件中文解码的问题显示的乱码,解决方法如下: 第一步:在右上角菜单栏处找到附加组件 第二步,选择拓展组件,搜索"下载文件编码",下载安装第一个插件 第三步,安装后在右上角有 ...

  4. 使用FPT上传下载文件和解决中文名文件乱码问题

    项目中从ftp服务器下载上传文件是一个经常用到的,下面是个人在用到的时候的一些学习记录. 为了方便,我在本地装了FileZilla Server,在本地搭建了一个ftp服务器. 先看一个简单的代码 i ...

  5. 苹果手机上下载的文件在哪里?

    (图文无关) 昨天在微信收到一个大文件,73M,突然意识到,微信升级,终于冲过了30M的文件传输限制.接下来的问题,这是一个开发工程文件,要在电脑开发环境使用,怎么把这个文件传输到电脑? 正常的方式是 ...

  6. Android 通过FTP方式下载服务器文件

    Android中大多数情况都是通过http请求后台数据,这种方式会有很多网络请求框架,现在有个需求是通过请求FTP服务器下载文件,那些经常用到的网络框架都用不了了,接下来我就来实现Android访问F ...

  7. java 下载txt文件(页面代码+Java后台代码+下载工具类)

    需求:页面有一个下载按钮,当点击下载的时候将页面表单数据下载到成为txt文件,并在网页直接下载该文件 1.页面(html) 下载一定要通过form表单的方式,js的ajax函数的返回类型只有xml.t ...

  8. php下载.xlsx,php下载excel文件

    php下载指定路径的excel代码: $download_path = ROOT_PATH.'admin/download/'; $filename2 = "库存明细(含有效期).xls&q ...

  9. 解决Http或Https中下载中文文件乱码和无法下载问题

    一.解决无法下载中文文件问题 在下载时,经常通过url方式链接到指定文件路径的方式进行下载文件,但是如果文件含有中文时,往往出现http 404 无法找到文件的错误,原因就是文件中包含中文的问题,因此 ...

  10. [Linux] Linux 客户端NFS挂载后目录下中文名文件乱码

    0x0 场景 服务端:Windows 2008R2 NFS共享目录D:/TEST 客户端:Linux/Centos 7.5 Centos 7.5 客户端NFS挂载 Windows2008R2 共享目录 ...

最新文章

  1. Android 中的 Service 全面总结(转)
  2. 6.最小角回归(Least Angle Regression)
  3. maven国内镜像(maven下载慢的解决方法)
  4. OpenVINO InferenceEngine 之Grap file
  5. jdk1.8新特性的应用-Stream 的终止操作
  6. centos 7.4 + postgresql 10.1 + pg_amqp
  7. LeetCode939
  8. 远程控制软件 mRemoteNG,管理多台虚拟机
  9. 火狐浏览器_全球知名度非常高的火狐浏览器,它好在哪呢?
  10. linux安全策略加固文档_系统加固之Linux安全加固
  11. 练习 P1957 口算练习题
  12. gatk过滤_GATK--使用转载
  13. Windows 10 解决无法完整下载安装语言包(日语输入法无法下载使用)
  14. vite:vue中引入图片报错require is not defined
  15. 程序 多核优化 linux,linux 多核CPU性能调优
  16. html响应式布局ipad,响应式布局(Responsive design)
  17. 计算机一级excel中模拟运算,2017年计算机一级《MS Office》操作试题及答案
  18. python去掉两边空格,Python去除字符串两端空格的方法
  19. 【C语言】循环语句(do while循环)
  20. stm32f302实现斩波控制步进电机_[转载]步进电机原理介绍与基于STM32的SPWM驱动步进电机,使用软件实现电机细分...

热门文章

  1. 17.20. 连续中值 堆
  2. K-Means优缺点
  3. this指针常识性问题
  4. JAVA----简单的自旋锁
  5. a ppt of CRF
  6. Python模拟新浪微博登录转载,是我的那篇资料来源
  7. oracle去重复值查询,Oracle 重复数据查询以及删除
  8. Gargamel:信息安全取证工具
  9. 安全管理:为软件供应链部署零信任方法
  10. python同名函数相互冲突_两个函数同名python