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 ...
随机推荐
- 前端科普系列(2):Node.js 换个角度看世界
本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/fPNMaeNYgU3eJsh0SLMRRg作者:孔垂亮 [前端科普系列]往期精彩内容: &l ...
- list求交集、并集、差集等//post或者get请求方法
package com.siebel.api.server.config.rest; import com.google.common.base.Joiner; import com.google.c ...
- px2vw一个px单位转成vw单位的VSCode插件
px2vw 一个 px 单位转成 vw 单位的 VSCode 插件
- 大数相加 a+b
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #i ...
- 一文搞清楚Java中的包、类、接口
写在开头 包.类.接口.方法.变量.参数.代码块,这些都是构成Java程序的核心部分,即便最简单的一段代码里都至少要包含里面的三四个内容,这两天花点时间梳理了一下,理解又深刻了几分. Java中的包 ...
- RLHF · PbRL | 速通 ICLR 2024 RLHF
检索关键词:ICLR 2024.reinforcement learning.preference.human feedback. https://openreview.net/search?term ...
- maven开源仓库
在公司开发一般都用公司内部的maven仓库,但回家之后,就访问不了公司的网络,使用不了公司的maven仓库,只能使用开源的maven仓库. 在网上搜索和整理了几个比较好用的maven开源镜像仓库,记录 ...
- Oracle数据库如何解决创建用户名开头必须要C##问题?
1.问题 我们在创建用户,概要文件等时,由于使用的是容器数据库,其文件名必须以C##开头. 我们在学习过程中暂时不需要对齐进行区分,所以如何修改这个设定呢? 2.解决 参考链接如何解决创建用户名开头必 ...
- 【RTOS】基于RTOS的嵌入式系统看门狗策略
RTOS - high integrity systems 看门狗策略 Watchdog Strategies for RTOS enabled embedded systems 介绍 看门狗定时器就 ...
- Linux-文件用户及组管理-chown-chgrp