Flask 实现文件上传下载
Flask 针对文件的上传下载相关代码片段,多种方法,包括限制文件格式,大小等。
实现图片文件上传
# name: 简单的实现文件上传任务.
import os
from flask import Flask, request, url_for, send_from_directory
from werkzeug import secure_filename
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = "static/" # 将文件上传到static目录
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 限制只能上传16M的文件
html = '''
<!DOCTYPE html>
<form method=post enctype=multipart/form-data>
<input type=file name=file>
<input type=submit value=上传文件>
</form>
'''
def allowed_file(filename):
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS
@app.route('/uploads/<filename>')
def uploaded_file(filename):
return send_from_directory(app.config['UPLOAD_FOLDER'],filename)
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST':
file = request.files['file']
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
file_url = url_for('uploaded_file', filename=filename)
return html + '<br><img src=' + file_url + '>'
return html
if __name__ == '__main__':
app.run()
# name: 通过使用flask_uploads插件完成快速上传
import os
from flask import Flask, request
from flask_uploads import UploadSet, configure_uploads, IMAGES,patch_request_class
app = Flask(__name__)
app.config['UPLOADED_FILE_DEST'] = "static/" # 上传文件后的存储位置
patch_request_class(app, 32 * 1024 * 1024) # 限制最大上传为32M
# UploadSet=允许上传的格式可配置为 All + TEXT + DOCUMENTS + IMAGES + DATA
photos = UploadSet('file', IMAGES)
configure_uploads(app, photos)
html = '''
<!DOCTYPE html>
<form method=post enctype=multipart/form-data>
<input type=file name=photo>
<input type=submit value=上传>
</form>
'''
@app.route('/', methods=['GET', 'POST'])
def upload_file():
if request.method == 'POST' and 'photo' in request.files:
filename = photos.save(request.files['photo'])
file_url = photos.url(filename) # 得到文件的路径
return html + '<br><img src=' + file_url + '>'
return html
if __name__ == '__main__':
app.run()
<!--name: index.html 通过模板生成上传-->
<!DOCTYPE html>
<form method="POST" enctype="multipart/form-data">
{{ form.hidden_tag() }}
{{ form.photo }}
{% for error in form.photo.errors %}
<span style="color: red;">{{ error }}</span>
{% endfor %}
{{ form.submit }}
</form>
{% if file_url %}
<br><img src="{{ file_url }}">
{% endif %}
# name: app.py 通过使用WTF表单完成上传.
import os
from flask import Flask, render_template
from flask_uploads import UploadSet, configure_uploads, IMAGES, patch_request_class
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired, FileAllowed
from wtforms import SubmitField
app = Flask(__name__)
app.config['SECRET_KEY'] = 'My Name Lyshark'
app.config['UPLOADED_PHOTOS_DEST'] = "static/"
photos = UploadSet('photos', IMAGES)
configure_uploads(app, photos)
patch_request_class(app) # 设置最大上传大小,默认16M
class UploadForm(FlaskForm):
photo = FileField(validators=[
FileAllowed(photos, u'只能上传图片!'),
FileRequired(u'文件未选择!')])
submit = SubmitField(u'上传')
# 列出所有文件
#{% for i in filename %}
# {{ i }}
#{% endfor %}
@app.route("/list",methods=['GET'])
def ListFile():
filename = os.listdir(app.config['UPLOADED_PHOTOS_DEST'])
return render_template('login.html', filename=filename)
@app.route('/', methods=['GET', 'POST'])
def upload_file():
form = UploadForm()
if form.validate_on_submit():
filename = photos.save(form.photo.data)
file_url = photos.url(filename)
else:
file_url = None
return render_template('index.html', form=form, file_url=file_url)
if __name__ == '__main__':
app.run()
上传文件并重命名
<!--name: upload.html 上传文件-->
<script type="text/javascript">
function CheckFileType(filename)
{
var flag = false;
var arry = ["bmp","jpg"];
var index = filename.lastIndexOf(".");
var ext = filename.substr(index+1);
for(var i=0;i<arry.length;i++)
{
if(ext == arry[i])
{
flag=true;
break;
}
}
if(!flag){alert('错误,文件名后缀不合法!');}
}
</script>
<body>
<form action="/upload" enctype="multipart/form-data" method="post">
<input type="file" name="file" onchange="CheckFileType(this.value)">
<input type="submit" value="上传文件">
</form>
<p style="color: green">状态: {{ file_flage }}</p>
</body>
# name: app.py
from flask import Flask,render_template,request
import os,uuid
app = Flask(__name__)
app.config['MAX_CONTENT_LENGTH'] = 3000000 # 限制文件上传最大为3MB
@app.route("/upload",methods=['GET','POST'])
def upload_file():
if request.method == "GET":
return render_template("upload.html")
elif request.method == "POST":
file = request.files["file"]
filename = str(file.filename)
if len(filename) >= 20: # 限制文件名的长度必须在20个字符以内
return render_template("upload.html",file_flage="文件名长度超出了限制!")
else:
if filename.find(".") >= 0: # 查找文件中是否包含点这个字符
filetype = file.filename.split(".")[1] # 取出文件类型,后期做判断
if filetype != None and filetype == "bmp": # 后缀格式必须是bmp结尾
uid = uuid.uuid4() # 生成随机名称
save_file_name = str(uid) + "." + filetype # 拼接名称
file.save(save_file_name) # 保存文件
return render_template("upload.html",file_flage="文件上传成功 {}".format(save_file_name))
else:
return render_template("upload.html",file_flage="没有选择文件,或不是图片格式,上传失败!")
return render_template("upload.html",file_flage="文件上传失败,未知错误!")
if __name__ == '__main__':
app.run()
实现文件下载功能
<!--name download.html-->
<script type="text/javascript">
function Download(filename)
{
if(filename){window.location.href='/download/?path=' + filename}
}
</script>
<body>
<form action="/download" enctype="multipart/form-data" method="get">
<input type="text" name="down" onchange="Download(this.value)"/>
<input type="submit" value="下载文件" >
</form>
</body>
# name: app.py
from flask import Flask, render_template, request, Response
app = Flask(__name__)
@app.route('/download/', methods=['GET', 'POST'])
def download_file():
if request.method == 'GET':
args = request.args.get("path").replace("/","").replace("\\","")
args = args.replace("<>","").replace("<!--","")
args = "./templates/" + args
print("下载的文件: {}".format(args))
def send_file():
store_path = args
with open(store_path, 'rb') as targetfile:
while 1:
data = targetfile.read(10 * 1024 * 1024) # 每次读取10M
if not data:
break
yield data
response = Response(send_file(), content_type='application/octet-stream')
response.headers["Content-disposition"] = 'attachment; filename=%s'%args.split("/")[2] # 取出下载的名字
return response
if __name__ == '__main__':
app.run()
Flask 实现文件上传下载的更多相关文章
- Struts的文件上传下载
Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...
- Android okHttp网络请求之文件上传下载
前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...
- Selenium2学习-039-WebUI自动化实战实例-文件上传下载
通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...
- 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)
1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...
- 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)
艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...
- ssh框架文件上传下载
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- SpringMVC——返回JSON数据&&文件上传下载
--------------------------------------------返回JSON数据------------------------------------------------ ...
- 【FTP】FTP文件上传下载-支持断点续传
Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...
- NetworkComms 文件上传下载和客户端自动升级(非开源)
演示程序下载地址:http://pan.baidu.com/s/1geVfmcr 淘宝地址:https://shop183793329.taobao.com 联系QQ号:3201175853 许可:购 ...
- SpringMVC文件上传下载
在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...
随机推荐
- Clion 中 Rust 插件开启 WSL 调试
Rust Linux 配置 wsl 中执行命令: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh 按照可能会卡住,需要在本 ...
- AtCoder Beginner Contest 166 (A~E)
比赛链接:Here AB水题 C - Peaks 题意: 给出 \(n\) 个观察台的高度,以及 \(m\) 条边,定义"好观察台":比所有直接相连的观测台都高 思路: 因为道路是 ...
- Educational Codeforces Round 107 (Rated for Div. 2) 个人题解(A~D)
补题链接:Here 1511A. Review Site 题意:\(n\) 个影评人,\(a_i\) 有三种类型,如下 \(a_i = 1\) ,则表示支持 \(a_i = 0\) ,则表示不支持 \ ...
- Android 加载图片占用内存分析
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/aRDzmMlkqB14Ty67GJs9vg作者:Xu Jie 不同Android版本,对一张图 ...
- vue子页面给App.vue传值
前端工程现在变成了单页面富文本的模式,整体布局定下来后,跳转只在<router-view>中展示,外层的布局不容易改变.最近发现有如下这个方法可以直接传值给App.vue,经过实践确实可以 ...
- vue-awesome-swiper swiper/dist/css/swiper.css 报not found错误
解决办法删除package-lock.json文件写死package.json版本号 "vue-awesome-swiper": "^3.1.3", 删除no ...
- canvas验证码 uni-app/小程序
1 <template> 2 <view class="logo-wrapper"> 3 <view class="logo-img&quo ...
- Vue 大屏可视化 铺满全屏
https://blog.csdn.net/u011097323/article/details/106728221?utm_medium=distribute.pc_aggpage_search_r ...
- 【Qt】开源一键代码开光神器,一行代码给你的项目施加祝福,减少Bug
年底啦,没什么项目,想摸鱼划水没见到什么好玩的东西,看到有人分享这个,直接做个库来玩下,之后说不定会嵌到公司的项目里面去.... 效果如下,佛光普照! 输入也只需要一行命令 magic_spells: ...
- Pgsql之查询一段时间内的所有日期
前几天干活儿的时候,项目中有这么个需求,需要用pgsql查询两个日期间的所有日期,包括年月日,下面贴代码: 1 select date(t) as day 2 from 3 generate_seri ...