文件上传时的最大图像大小

Posted

技术标签:

【中文标题】文件上传时的最大图像大小【英文标题】:Max image size on file upload 【发布时间】:2011-09-05 22:22:26 【问题描述】:

我的表单中有一个 ImageField。我将如何强制执行最小/最大文件大小,例如 --

image = forms.ImageField(max_size = 2MB) 

image = forms.ImageField(min_size = 100k)

谢谢。

【问题讨论】:

Django File upload size limit的可能重复 【参考方案1】:

基本上这是Django File upload size limit的副本

你有两个选择:

    在 Django 中使用验证来检查上传文件的大小。这种方法的问题是文件必须在验证之前完全上传。这意味着如果有人上传了一个 1TB 的文件,您可能会在用户收到表单错误之前用完硬盘空间。

    配置 Web 服务器以限制允许的上传正文大小。例如如果使用 Apache,请设置 LimitRequestBody 设置。这意味着如果用户尝试上传太多内容,他们将在 Apache 中获得可配置的错误页面

正如@pastylegs 在 cmets 中所说,将两者结合使用可能是最好的方法。假设您想要最大 5MB,也许在 Web 服务器级别强制执行 20MB 限制,在 Django 级别强制执行 5MB 限制。 20MB 的限制可以为恶意用户提供一些保护,而 Django 中的 5MB 限制提供了良好的用户体验。

【讨论】:

两者结合可能是个好主意。通过 apache/nginx 等(可能 50mb)将所有上传限制在合理的范围内,然后在应用程序级别使其更具体 @pastylegs 我同意,这也是我会采取的方法。【参考方案2】:

models.py

class Product(models.Model):
    image = models.ImageField(upload_to="/a/b/c/")

forms.py

class ProductForm(forms.ModelForm):
    # Add some custom validation to our image field
    def clean_image(self):
        image = self.cleaned_data.get('image', False)
        if image:
            if image._size > 4*1024*1024:
                raise ValidationError("Image file too large ( > 4mb )")
            return image
        else:
            raise ValidationError("Couldn't read uploaded image")

【讨论】:

forms.py 代码的第 4 行后面不应该有冒号,但它不会让我进行少于 6 个字符的更改。如果您要复制和粘贴此代码,请小心(而不是您应该复制+粘贴任何代码)。 如果有人对此答案感兴趣,I've written a blog post that touches on image validation when uploading an image via an URL 等等,这个是先上传整张图片还是先上传?在此验证发生之前,http 服务器(即 nginx)会不会将其捕获为 413? 只有在文件完全上传到服务器后,Django才会检查文件限制大小条件。所以为了避免不必要的流量使用,你需要实现client检查或apache检查。 应该是.size 而不是._size【参考方案3】:

这是我在 *** 上的这个问题的变体中没有看到的另一个选项:在您的模型中使用自定义验证器。如果您使用这种技术和 forms.py 中的 ModelForm,那么这应该就是您所需要的。

models.py

from django.core.exceptions import ValidationError

class Product(models.Model):
    def validate_image(fieldfile_obj):
        filesize = fieldfile_obj.file.size
        megabyte_limit = 5.0
        if filesize > megabyte_limit*1024*1024:
            raise ValidationError("Max file size is %sMB" % str(megabyte_limit))

    image = models.ImageField(upload_to="/a/b/c/", validators=[validate_image])

【讨论】:

澄清一下,这会在验证之前先完整上传文件,对吗?在这种情况下,我同意 bradley.ayers,您还应该设置网络服务器限制

以上是关于文件上传时的最大图像大小的主要内容,如果未能解决你的问题,请参考以下文章

el-upload上传时的文件类型和大小限制失效,如何处理?

通过远程 URL 上传文件?

nginx如何设置最大上传文件大小

jQuery文件上传调整大小上传的图像

MultipartFile接收文件时的文件大小设置

如何更改最大文件大小上传?