flask上传下载文件(一)下载
简介:#
作为一个可以和用户交互的web应用,必然要有数据导出功能,导出到excel是比较常用的方式。
flask有一个扩展叫flask-excel,可能不适合中国人用,因为没有看到修改列名的功能。也许以后会好点。内部原理也不清楚。
在查资料的时候发现了一个有趣的东西,叫流式,原博客地址为:https://www.cnblogs.com/Erick-L/p/7015783.html
大概的意思就是说,如果是有大量数据的传输,最好用流的方式,虽然也不怎么懂。
但是测试了两种方法以后,发现流式传输确实比较好用。
一:文件格式#
学艺不精,暂时只明白了csv和xls(xlsx)这两个格式。
1.csv#
CSV是文本文件,用记事本就能打开。是以逗号(,)分割列的一种存储方式。
CSV 文件格式只能保存活动工作表中的单元格所显示的文本和数值。下次打开,公式就没了。
2.xls(xlsx)#
XLS 是二进制的文件只有用 EXCEL(WPS) 或者其他的office办公软件才能打开。
XLS 中所有的数据行和字符都将保存。可以保存公式,格式,引用………一些东西。
二:传统方法#
1.send_file#
这种方法就是指定一个文件名,一堆参数告诉浏览器,这是下载文件,不是浏览网页。
def send_file(filename_or_fp, mimetype=None, as_attachment=False, attachment_filename=None, add_etags=True, cache_timeout=None, conditional=False, last_modified=None):
2.send_from_directory#
这个方法貌似好一点了,似乎不用自己配置一堆参数了。可惜,这是骗你的,return send_file(filename, **options),请参照send_file自己写参数,或者不写。
def send_from_directory(directory, filename, **options):
3.总结#
这两种方法貌似适合硬盘上已经存在的文件。
我们要实现的是动态查询结果,生成excel供客户下载。
似乎不是太好用。
笨办法就是自己去生成excel文件,供客户下载,下载完了再删除,这个貌似也没反馈信息。还要自己写文件管理的功能,删除超过几天的文件?
4.tempfile#
这个模块说是创建临时文件,自动管理的,或许配合自己生成文件,也可以。
三:临时文件写到内存里#
1.StringIO#
流式处理接口
2.避免创建文件#
http://flask.pocoo.org/snippets/32/
这个貌似解决了
3.示例代码#

#!/usr/bin/env python # Thanks to Dan Jacob for a part of the code ! from flask import Flask, send_file import StringIO app = Flask(__name__) @app.route('/') def index(): strIO = StringIO.StringIO() strIO.write('Hello from Dan Jacob and Stephane Wirtel !') strIO.seek(0) return send_file(strIO, attachment_filename="testing.txt", as_attachment=True) app.run(debug=True)

import numpy as np import pandas as pd from io import BytesIO from flask import Flask, send_file app = Flask(__name__) @app.route('/') def index(): #create a random Pandas dataframe df_1 = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=list('ABCD')) #create an output stream output = BytesIO() writer = pd.ExcelWriter(output, engine='xlsxwriter') #taken from the original question df_1.to_excel(writer, startrow = 0, merge_cells = False, sheet_name = "Sheet_1") workbook = writer.book worksheet = writer.sheets["Sheet_1"] format = workbook.add_format() format.set_bg_color('#eeeeee') worksheet.set_column(0,9,28) #the writer has done its job writer.close() #go back to the beginning of the stream output.seek(0) #finally return the file return send_file(output, attachment_filename="testing.xlsx", as_attachment=True) app.run(debug=True)
这似乎解决了我们生成文件,还需要管理文件的困扰。
四:大小和速度#
1.速度#
测试了几段代码的响应速度,send_file是比较适合发送已经存在于硬盘上的文件。动态生成的文件,需要等文件生成,客户端才会有下载文件的提示。
如果文件比较大的话,点击下载后,还要几十秒才能开始下载,即使生成的文件放到内存也不快。
2.响应流#
Flask响应流的实现原理就是通过Python的生成器,也就是大家所熟知的yield的表达式,将yield的内容直接发送到客户端。
3.示例代码#
@app.route('/large.csv') def generate_large_csv(): def generate(): for row in range(50000): line = [] for col in range(500): line.append(str(col)) if row % 1000 == 0: print 'row: %d' % row yield ','.join(line) + '\n' return Response(generate(), mimetype='text/csv')
这段代码是生成csv格式的文件下载,总大小大概是90M左右。
优点是随点随开始下载,后台继续生成新的文件内容。
如果用传统方法,要等整个90M文件生成完毕,才会开始下载。内存模式的代码没测试。
4.优点:#
处理大量数据时,响应速度快。
5.缺点:#
暂时我只看示例代码,会处理csv文件,excel文件还不会。
#
作者:上官飞鸿
出处:https://www.cnblogs.com/jackadam/p/9535139.html
版权:本作品采用「知识共享-署名-非商业性-禁止演绎(CC-BY-NC-ND)」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!