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文件还不会。
flask上传下载文件(一)下载的更多相关文章
- 【Azure Developer】VS Code运行Java 版Azure Storage SDK操作Blob (新建Container, 上传Blob文件,下载及清理)
问题描述 是否可以用Java代码来管理Azure blob? 可以.在代码中加入azure-storage-blob依赖.即可使用以下类操作Azure Storage Blob. BlobServic ...
- flask上传excel文件,无须存储,直接读取内容
运行环境python3.6 import xlrd from flask import Flask, request app = Flask(__name__) @app.route("/& ...
- Flask 上传下载文件
上传文件示例代码 #encoding:utf8 from werkzeug.utils import secure_filename from flask import Flask,render_te ...
- struts2实现文件上传(多文件上传)及下载
一.要实现文件上传,需在项目中添加两个jar文件 二.上传准备的页面 注:必须植入enctype="multipart/form-data"属性,以及提交方式要设置成post &l ...
- 利用SkyDrive Pro 迅速批量下载SharePoint Server 上已上传的文件
在上一篇<SharePoint Server 2013 让上传文件更精彩>,我们一起了解了如何快速的方便的上传批量文件到SharePoint Server 2013 ,而在这一篇日志中您将 ...
- 用java 代码下载Samba服务器上的文件到本地目录以及上传本地文件到Samba服务器
引入: 在我们昨天架设好了Samba服务器上并且创建了一个 Samba 账户后,我们就迫不及待的想用JAVA去操作Samba服务器了,我们找到了一个框架叫 jcifs,可以高效的完成我们工作. 实践: ...
- iOS-网络编程(二)文件上传和断点离线下载
一. iOS中发送HTTP请求的方案 在iOS中,我们常用发送HTTP请求的方案有苹果原生(自带)NSURLConnection:用法简单,最古老最经典最直接的一种方案 (iOS 9.0弃用)NSUR ...
- 解决WordPress无法上传媒体文件以及无法下载和安装主题与插件的问题
前言: 我的个人博客网站荒原之梦在安装成功WordPress之后本来是可以上传媒体文件,安装主题和插件的,但是后来不知道怎么回事就出了问题:不能上传媒体文件也不能安装主题和插件了.出现这个问题后我尝试 ...
- JavaWeb多文件上传及zip打包下载
项目中经常会使用到文件上传及下载的功能.本篇文章总结场景在JavaWeb环境下,多文件上传及批量打包下载功能,包括前台及后台部分. 首先明确一点: 无法通过页面的无刷新ajax请求,直接发下载.上 ...
- paramiko模块的安装和使用(含上传本地文件或文件夹到服务器,以及下载服务器文件到本地)
安装和使用分两步介绍: 介绍一下,本文的运行环境是win7 64位 和python 2.7 . 安装: WIN7_64位 安装python-ssh访问模块(paramiko)的安装教程,本人亲测下面 ...
随机推荐
- thinkphp5的Auth权限认证实战
thinkphp5的Auth权限认证实战 一.总结 一句话总结:基于角色的权限管理(真正做一遍,就会发现很简单,不然一直都是半懂不懂的) 角色 权限 真正做一遍,就会发现很简单,不然一直都是半懂不懂的 ...
- python+selenium:点击页面元素时报错:WebDriverException: Message: Element is not clickable at point (1372.5, 9.5). Other element would receive the click: <li style="display: list-item;" id="tuanbox"></li>
遇到一个非常郁闷的问题,终于解决了, 问题是这样的,NN网站的价格计划,每一个价格计划需要三连击才能全部点开,第一个房型的价格计划是可以正确三连击打开的,可是第二个房弄就不行了,报错说不是可点击的 ...
- LeetCode--844--比较含退格的字符串(java)
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = " ...
- mat 使用 分析 oom 使用 Eclipse Memory Analyzer 进行堆转储文件分析
概述 对于大型 JAVA 应用程序来说,再精细的测试也难以堵住所有的漏洞,即便我们在测试阶段进行了大量卓有成效的工作,很多问题还是会在生产环境下暴露出来,并且很难在测试环境中进行重现.JVM 能够记录 ...
- Python实现一条基于POS算法的区块链
区块链中的共识算法 在比特币公链架构解析中,就曾提到过为了实现去中介化的设计,比特币设计了一套共识协议,并通过此协议来保证系统的稳定性和防攻击性. 并且我们知道,截止目前使用最广泛,也是最被大家接受的 ...
- Flex scroller皮肤的使用
Flex4 scroller 自定义皮肤 十月 15, 2010 Posted by admin flex4里引入了sparkSkin, spark包里的可视控件可以通过指定skinClass的值来修 ...
- VS Code行内样式提示插件
打开vscode,在软件界面左下角找到“齿轮”标志并点击,在弹出的菜单中选择“设置”,把下面的代码添加到设置里. { "workbench.colorTheme": "C ...
- SSH登录服务器修改VNC的问题
远程登陆服务器直接用 ssh hostname@ip_address 即可登陆.hostname就是自己的用户名,ip_address就是IP地址. 关于VNC使用的命令: 杀死VNC: vncser ...
- ERROR: java.lang.NullPointerException的一种情况
java.lang.NullPointerException错误,错误原因就是以下六条没配置完: 1.JAVA环境配置正确.2.源码里面的包没有与tomcat的包冲突.3.把数据库文件给导入到了SQL ...
- leetcode-algorithms-22 Generate Parentheses
leetcode-algorithms-22 Generate Parentheses Given n pairs of parentheses, write a function to genera ...