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)
# 配置上传文件大小,默认为64M,
# 若设置为None,则以MAX_CONTENT_LENGTH配置为准
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)
            # 根据文件名获取上传文件的URL
            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)
    ...

results matching ""

    No results matching ""