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

Dav*_*542 43 django image-processing django-forms

我的形式有一个ImageField.我如何强制执行文件大小最小/最大,类似于 -

image = forms.ImageField(max_size = 2MB) 
Run Code Online (Sandbox Code Playgroud)

要么

image = forms.ImageField(min_size = 100k)
Run Code Online (Sandbox Code Playgroud)

谢谢.

Tim*_*ony 53

models.py

class Product(models.Model):
    image = models.ImageField(upload_to="/a/b/c/")
Run Code Online (Sandbox Code Playgroud)

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")
Run Code Online (Sandbox Code Playgroud)

  • 如果有人对这个答案感兴趣,[我写了一篇博文,通过网址上传图片时涉及图像验证](http://timmyomahony.com/blog/upload-and-validate-image-from- URL合的django /) (3认同)
  • 等等,这是先上传整个图像还是必须先上传?在进行验证之前,http 服务器(即 nginx)不会将其捕获为 413 吗? (2认同)
  • 它应该是`.size`而不是`._size` (2认同)

bra*_*ers 47

基本上这是Django文件上传大小限制的副本

您有两种选择:

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

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

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


ram*_*dog 23

这是另一个选项,我在stackoverflow上没有看到这个问题的变体:在模型中使用自定义验证器.如果你在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])
Run Code Online (Sandbox Code Playgroud)

  • 只是为了澄清,这会在验证之前先完整地上传文件,对吗?在这种情况下,我同意bradley.ayers,您还应该设置Web服务器限制 (2认同)