file upload的最大图像大小

我在我的表单中有一个ImageField。 我将如何执行一个文件大小最小/最大,就像 –

image = forms.ImageField(max_size = 2MB) 

要么

 image = forms.ImageField(min_size = 100k) 

谢谢。

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") 

基本上这是Djangofile upload大小限制的重复

你有两个select:

  1. 在Django中使用validation来检查上传的文件的大小。 这种方法的问题是文件在被validation之前必须完全上传。 这意味着,如果有人上传1TB文件,则可能会在用户发生表单错误之前用完硬盘空间。

  2. configurationWeb服务器以限制允许的上传主体大小。 例如,如果使用Apache,请设置LimitRequestBody设置。 这将意味着如果用户尝试上传太多,他们会在Apache中获得一个可configuration的错误页面

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

这里是另一个选项,我没有看到这个问题的变种在stackoverflow:在你的模型中使用自定义validation。 如果你在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])