【问题标题】:Uploading multiple images corrupts all but first - Flask上传多个图像会破坏除第一个之外的所有图像 - Flask
【发布时间】:2017-02-04 23:36:13
【问题描述】:

我正在尝试上传多张图片,但除了文件中的第一张图片,所有其他图片在上传期间都损坏了。我可以毫无问题地查看第一张图像,但无法查看其余图像。窗户说We can't open this file。这几乎听起来扩展名是未知的。

在旁注中,当我查看其中一张损坏图像的详细信息时,所有字段都是空的,除了底部、文件名等。

# view.py 
@myVacation_blueprint.route('/logVacation', methods=['GET', 'POST'])
@login_required
def log_vacation():
form = LogVacationForm()

if request.method == 'POST':
    if form.validate_on_submit():
        try:
            # Get the image name
            uploaded_images = request.files.getlist('photo')
            for image in uploaded_images:
                filename = secure_filename(image.filename)
                # Get the extension
                extension = filename.split('.')[1]
                filename = filename.split('.')[0]
                # Concatenate filename and current time
                filename = str(filename) + str(time.time())
                # Hash the filename
                hash_file_name = bcrypt.generate_password_hash(filename).decode('utf-8')
                # Normalize
                filename = "".join([c if c.isalnum() else "" for c in hash_file_name])
                # Add the extension
                filename = filename + '.' + str(extension)
                # Save the file
                directory = _user_img_folder(form)
                print(os.path.join(directory, filename))
                form.photo.data.save(os.path.join(directory, filename))
        except Exception as e:
            print(e)

        return render_template('myVacation.html')
    else:
        filename = None
return render_template('logVacation.html', form=form, error=error)


# forms.py
class LogVacationForm(FlaskForm):
vacation_name = StringField('Vacation Name', validators=[DataRequired(),   Length(min=6, max=25)])
location = StringField('Location', validators=[DataRequired()])
with_who = StringField('With_Who')
description = TextAreaField('Description', render_kw={
    'class': 'vacation_description',
    'rows': 10
})
photo = FileField('Select Images', validators=[
    # FileRequired(),
    FileAllowed(['jpg', 'png'], 'Images only')],
                  render_kw={'multiple': True}
                  )

# logVacation.html

# many lines....
<form class="logVacation" enctype=multipart/form-data role="form" method="post" action="/logVacation">
# Some other input
{{ form.photo(multiple="multiple") }}
# Some other input
<button class="btn btn-sm btn-success" value="upload" type="submit">Done</button>
</form>

我在这里错过了什么?

注意:我刚刚注意到view.py 的值form.photo.data 在第一个图像名称之后永远不会改变。所以显然它没有接收到其他图像的数据。

【问题讨论】:

    标签: python image flask upload


    【解决方案1】:
    • 如果你使用form.validate_on_submit(),那么if request.method == 'POST'可以去掉。

    • .save() 方法的对象是文件流 (image),而不是表单数据 (form.photo.data)。

    就像这样:

    if form.validate_on_submit():
        for image in request.files.getlist('photo'):
            ...
            image.save(os.path.join(directory, filename))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多