upload files using flask-uploads

你说的曾经没有我的故事 提交于 2019-12-04 09:06:31

The problem is, you have two upload set: one for views.py (photos), one for forms.py(images). You should import the upload set photos from your app.py.

Besides, Flask-Uploads will call secure_filename() to verify filename for you, so this line is unnecessary:

from werkzeug import secure_filename

A complete demo is here:

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'] = 'I have a dream'
app.config['UPLOADED_PHOTOS_DEST'] = os.getcwd()

photos = UploadSet('photos', IMAGES)
configure_uploads(app, photos)
patch_request_class(app)  # set maximum file size, default is 16MB


class UploadForm(FlaskForm):
    photo = FileField(validators=[FileAllowed(photos, u'Image only!'), FileRequired(u'File was empty!')])
    submit = SubmitField(u'Upload')


@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()

template:

<h1>Photo Upload</h1>
<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 %}

Gist Link: https://gist.github.com/greyli/81d7e5ae6c9baf7f6cdfbf64e8a7c037

I was running into the same problem.

The problem is that in your configuration you configure the following UploadSet

photos = UploadSet('photos', IMAGES)
configure_uploads(app, photos)

But the form field cover uses the following UploadSet

images = UploadSet("images", IMAGES)

You just need to import the photos UploadSet and change the cover field to:

cover = FileField("cover", [validators.optional(),file_allowed(photos, "Images only!")])

This did the trick for me.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!