如何在Flask-WTF的FileField中设置文件大小限制?

6
3个回答

4

我们需要添加一个像这样的自定义验证器:

from wtforms.validators import ValidationError

def FileSizeLimit(max_size_in_mb):
    max_bytes = max_size_in_mb*1024*1024
    def file_length_check(form, field):
        if len(field.data.read()) > max_bytes:
            raise ValidationError(f"File size must be less than {max_size_in_mb}MB")
        field.data.seek(0)
    return file_length_check

然后将验证器传递给文件上传字段,像这样:

uploaded_file = FileField('Upload your file', [FileRequired(), FileSizeLimit(max_size_in_mb=2)])

致谢:

感谢 @yomajo指出了如何在测量文件大小后重置文件流指针。


3

上述答案在验证时有效,但在实际保存文件时会失败,原因是在大小验证中文件流已经用尽,代码如下:len(field.data.read())

为了节省时间,我最终得到的解决方案:

def FileSizeLimit(max_size_in_mb):
    max_bytes = max_size_in_mb*1024*1024

    def file_length_check(form, field):
        if len(field.data.read()) > max_bytes:
            raise ValidationError(
                f'File size is too large. Max allowed: {max_size_in_mb} MB')
        field.data.seek(0)
    return file_length_check

0
最简单的方法是使用 app.config['MAX_CONTENT_LENGTH']。
app.config['MAX_CONTENT_LENGTH'] = limit_in_mb * 1024 * 1024

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接