在Flask中实现文件的上传,传统的方法比较繁琐,因此我们使用Flask为我们封装好的库来进行文件上传操作。
优点:优化了文件上传操作,使用方便
准备工作
安装文件上传需要用到的库
pip install flask-uploads
正式操作
我们计划使用Flask中表单处理的扩展库'flask-wtf'来实现文件提交的功能
导入类库
#文件类库
from flask_uploads import UploadSet,IMAGES,configure_uploads,path_request_class
#表单类库
from flask_wtf import FlaskForm
from wtforms import SubmitField
from flask_wtf.file import FileField,FileAllowed.FileRequired
创建对象
#上传文件保存位置
#此处[]中的内容要写成'UPLOADED_名字_DEST',名字:创建上传对象时第一个参数大写
app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(os.getcwd(),'static/upload')
#加密
app.config['SECRET_KEY'] = '123456'
#文件大小限制
app.config['MAX_CONTENT_LENGTH'] = 1024 * 1024 * 8
#创建上传对象,指定名字和上传文件的类型
photos = UploadSet('photos',IMAGES)
#配置上传对象
configure_uploads(app,photos)
#设置上传文件大小,默认64M,设置为None时,大小由'MAX_CONTENT_LENGTH'决定
patch_request_class(app,size=None)
创建表单类
class UploadForm(FlaskForm):
photo = FileField('头像',validators=[FileRequired('请选择文件'),FileAllowed(photos,'只能上传图片类型')])
submit = SubmitField('上传')
添加视图函数
@app.route('/upload/',methods=['GET','POST'])
def upload():
#创建表单对象
form = UploadForm()
if form.validate_on_submit():
#提取上传文件信息
photo = form.photo.data
if photo:
photos.save(photo)
return '文件上传成功'
return '文件上传失败'
return render_template('upload.html',form=form)
以上就是最简单的Flask使用flask-uploads库实现文件上传操作了,当然我们也可以添加一些其他的功能,比如说将上传的图片名字改为随机字符串加后缀的形式,接着修改图片尺寸,生成缩略图,然后再保存。
生成缩略图需要用到'PIL'库,但是这个库只支持 py2 版本,所以我们需要安装一个补丁,使这个库在 py3 中也能够使用
pip install pillow
首先,我们需要定义一个生成随机字符串的函数
#生成随机字符串
def random_string(Length=32):
import random
base_str = '0123456789abcdefghijklmnopqrs'
return ''.join(random.choice(base_str) for i in range(Length))
接着,修改视图函数
form = UploadForm()
if form.validate_on_submit():
#提取上传文件信息
photo = form.photo.data
if photo:
#提取文件后缀
suffix = os.path.splitext(photo.filename)[1]
#生成随机文件名
filename = random_string() + suffix
#保存文件
photos.save(photo,name=filename)
#生成缩略图
from PIL import Image
#拼接完整路径名
pathname = os.path.join(app.config['UPLOADED_PHOTOS_DEST'],
filename)
#打开文件
img = Image.open(pathname)
#设置尺寸
img.thumbnail((64,64))
#重新保存
img.save(pathname)
# return '上传成功'
return render_template('upload.html',form=form)
最后我们要是想要美化一下我们的前端页面,我们可以使用'flask-bootstrap'库
安装方法同样是
pip install flask-bootstrap
导入类库 'from flask_bootstrap import Bootstrap',创建对象 ' Bootstrap(app)',接下来在前端即可使用Bootstrap库
{% extends 'bootstrap/base.html' %}
{% from 'bootstrap/wtf.html' import quick_form %}
{% block title %}
完整的文件上传
{% endblock %}
{% block content %}
<div class="container">
<h1>文件上传测试</h1>
{{ quick_form(form) }}
</div>
{% endblock %}