如何检查文件上传字段是否为空?

时间:2019-10-10 11:40:44

标签: python flask wtforms

我有一个表格,可以上传多个图像文件。当我选择要上传的图像时,一切正常。如果我尝试提交不带文件的表单,则会收到错误消息

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似乎不是文件存储对象,而是为空。我如何测试它是否为空?

1 个答案:

答案 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