我有一个表格,可以上传多个图像文件。当我选择要上传的图像时,一切正常。如果我尝试提交不带文件的表单,则会收到错误消息
OSError: cannot identify image file <FileStorage: '' ('application/octet-stream')>
我希望能够检查该字段是否为空,如果是,请绕过我的save_images函数。
这是我的表格
class NewPortfolioProject(FlaskForm):
title = StringField('Project Name', validators=[DataRequired(), Length(max=50)])
description = TextAreaField('Description', validators=[
DataRequired(), Length(min=1, max=1000)])
tags = StringField('#Tags - space separated', validators=[DataRequired()])
link = StringField('Link to live project')
github_link = StringField('Github link', validators=[DataRequired()])
images = MultipleFileField('Add screenshots/wireframes', validators=[FileAllowed(['png', 'jpg'])])
submit = SubmitField('Save Project')
在routes.py文件中,我正在尝试测试MultipleFileField是否包含数据
if form.validate_on_submit():
if not form.images.data:
portfolio.insert_one(new_doc)
else:
image_files = save_images(form.images.data)
new_doc['images'] = image_files
portfolio.insert_one(new_doc)
但是,这(以及我尝试过的所有其他方法)不起作用。
form.images.data似乎不是文件存储对象,而是为空。我如何测试它是否为空?
答案 0 :(得分:0)
显然,当您在MultipleFileField上调用form.images.data时,它返回的列表永远不会为空,这就是为什么如果form.images.data 检查始终返回true。
我最终在图像保存方法中使用try / except解决了该问题,因为在我的情况下,当PIL尝试打开图像并对其进行处理时,错误本身就会出现。
def save_image(form_picture):
random_hex = secrets.token_hex(8)
_, f_ext = os.path.splitext(form_picture.filename)
picture_fn = random_hex + f_ext
picture_path = os.path.join(current_app.root_path, 'static/images', picture_fn)
output_size = (600, 400)
try:
i = Image.open(form_picture)
i.thumbnail(output_size)
i.save(picture_path)
return picture_fn
except:
return False