Flask-Uploads
说明
安装
pip install flask-uploads
文档
使用
from flask_uploads import UploadSet, IMAGES
from flask_uploads import configure_uploads
from flask_uploads import patch_request_class
import os
app.config['UPLOADED_PHOTOS_DEST'] = os.getcwd()
app.config['MAX_CONTENT_LENGTH'] = 8 * 1024 * 1024
photos = UploadSet('photos', IMAGES)
configure_uploads(app, photos)
patch_request_class(app, size=None)
@app.route('/upload/', methods=['GET', 'POST'])
def upload():
img_url = None
if request.method == 'POST':
photo = request.files.get('photo')
if photo:
filename = photos.save(photo)
img_url = photos.url(filename)
return render_template('upload.html', img_url=img_url)
综合使用
- 结合flask-bootstrap、flask-wtf、flask-uploads等完成文件上传
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed, FileRequired
from wtforms import SubmitField
from flask_uploads import UploadSet, IMAGES
from flask_uploads import configure_uploads
from flask_uploads import patch_request_class
from flask_bootstrap import Bootstrap
import os
bootstrap = Bootstrap(app)
app.config['SECRET_KEY'] = '123456'
app.config['MAX_CONTENT_LENGTH'] = 8 * 1024 * 1024
app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(os.getcwd(), 'static/upload')
photos = UploadSet('photos', IMAGES)
configure_uploads(app, photos)
patch_request_class(app, size=None)
class UploadForm(FlaskForm):
photo = FileField('头像', validators=[FileRequired(message='请选择文件'),
FileAllowed(photos, message='只能上传图片文件')])
submit = SubmitField('上传')
@app.route('/upload/', methods=['GET', 'POST'])
def upload():
img_url = None
form = UploadForm()
if form.validate_on_submit():
photo = form.photo.data
filename = photos.save(photo)
img_url = photos.url(filename)
return render_template('upload.html', form=form, img_url=img_url)
{% extends 'bootstrap/base.html' %}
{% from 'bootstrap/wtf.html' import quick_form %}
{% block title %}完整的文件上传{% endblock %}
{% block content %}
<div class="container">
{% if img_url %}
<img src="{{ img_url }}">
{% endif %}
{{ quick_form(form) }}
</div>
{% endblock %}
def random_string(length=32):
import random
base_str = 'abcdefghijklmnopqrstuvwxyz1234567890'
return ''.join(random.choice(base_str) for i in range(length))
@app.route('/upload/', methods=['GET', 'POST'])
def upload():
。。。
suffix = os.path.splitext(photo.filename)[1]
filename = random_string() + suffix
photos.save(photo, name=filename)
。。。
- 生成缩略图:PIL模块(只支持py2,要支持py3需要安装pillow)
from PIL import Image
@app.route('/upload/', methods=['GET', 'POST'])
def upload():
...
pathname = os.path.join(app.config['UPLOADED_PHOTOS_DEST'], filename)
img = Image.open(pathname)
img.thumbnail((64, 64))
img.save(pathname)
...