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 实现文件上传下载的更多相关文章

  1. Struts的文件上传下载

    Struts的文件上传下载 1.文件上传 Struts2的文件上传也是使用fileUpload的组件,这个组默认是集合在框架里面的.且是使用拦截器:<interceptor name=" ...

  2. Android okHttp网络请求之文件上传下载

    前言: 前面介绍了基于okHttp的get.post基本使用(http://www.cnblogs.com/whoislcj/p/5526431.html),今天来实现一下基于okHttp的文件上传. ...

  3. Selenium2学习-039-WebUI自动化实战实例-文件上传下载

    通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...

  4. 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)

    1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...

  5. 艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输)(一)

    艺萌TCP文件上传下载及自动更新系统介绍(TCP文件传输) 该系统基于开源的networkComms通讯框架,此通讯框架以前是收费的,目前已经免费并开元,作者是英国的,开发时间5年多,框架很稳定. 项 ...

  6. ssh框架文件上传下载

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. SpringMVC——返回JSON数据&&文件上传下载

    --------------------------------------------返回JSON数据------------------------------------------------ ...

  8. 【FTP】FTP文件上传下载-支持断点续传

    Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...

  9. NetworkComms 文件上传下载和客户端自动升级(非开源)

    演示程序下载地址:http://pan.baidu.com/s/1geVfmcr 淘宝地址:https://shop183793329.taobao.com 联系QQ号:3201175853 许可:购 ...

  10. SpringMVC文件上传下载

    在Spring MVC的基础框架搭建起来后,我们测试了spring mvc中的返回值类型,如果你还没有搭建好springmvc的架构请参考博文->http://www.cnblogs.com/q ...

随机推荐

  1. JavaScript WebSocket C# SuperSocket.WebSocket 示例

    C# WebSocket 后端代码: using Newtonsoft.Json; using SuperSocket.WebSocket; using System; using System.Co ...

  2. Win 下 Redis 设置开机启动

    1,在redis的目录下执行(执行后就作为windows服务了) redis-server.exe --service-install redis.windows.conf 2,安装好后需要手动启动r ...

  3. C++正则表达式的初步使用

    正则表达式(Regular Expressions),又被称为regex.regexp 或 RE,是一种十分简便.灵活的文本处理工具.它可以用来精确地找出某文本中匹配某种指定规则的内容.从C++11开 ...

  4. CodeForces - 651A Joysticks ( 不难 但有坑 )

    正式更换编译器为: VS Code 如何配置环境:click here 代码格式化工具:clang-format A. Joysticks 题目连接: http://www.codeforces.co ...

  5. java生成word证明文件

    开发中遇到系统自动出常用证明的需求,例如某在校大学生要求学校开具在校证明,这类证明数量大格式统一,使用代码如何实现. 一.设置word模板 下图中红色部分就是要动态变化的. 模板存放位置 二.依赖破p ...

  6. 【内核】深入分析内核panic(二)--内核中的少林扫地僧-NMI Watchdog Timer

    没有完美的代码 没有完美的人,更没有完美的代码.虽然教科书上说deadlock(死锁)多么不好不好,但是在现实生活中,很难把它完全消灭.假设不小心内核出现了deadlock,可能你得干瞪眼.CPU就在 ...

  7. The requested URL could not be retrieved

    在开发过程中,调用对外接口,返回了一长串的标签提示,如下 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "ht ...

  8. Laravel : Eloquent 新增

             public function ormCreate()     {         #  1. 使用模型新增 ->save()         /*               ...

  9. WebStrom中解决中文乱码——2021050

    1.首先将IDE Encoding,Project Encoding和下面的Default Encoding for properties file设置为utf-8 2.在HTML中添加 <me ...

  10. [转帖]JVM相关 - StackOverflowError 与 OutOfMemoryError

    https://zhuanlan.zhihu.com/p/265039643   7 人赞同了该文章 本文基于 Java 15 StackOverflowError 与 OutOfMemoryErro ...