我的表单中有一个ImageField。我将如何强制执行文件大小min / max,例如 -
image = forms.ImageField(max_size = 2MB)
或
image = forms.ImageField(min_size = 100k)
谢谢。
答案 0 :(得分:51)
<强> 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")
答案 1 :(得分:47)
基本上这是Django File upload size limit
的副本您有两种选择:
在Django中使用验证来检查上传文件的大小。此方法的问题是文件必须在验证之前完全上载。这意味着如果有人上传1TB文件,您可能会在用户收到表单错误之前耗尽硬盘空间。
配置Web服务器以限制允许的上载正文大小。例如如果使用Apache,请设置LimitRequestBody
设置。这意味着如果用户尝试上传太多,他们将在Apache中配置错误页面
正如@pastylegs在评论中所说,使用两者的组合可能是最好的方法。假设您最多需要5MB,可能在Web服务器级别强制执行20MB限制,在Django级别执行5MB限制。 20MB的限制将为恶意用户提供一些保护,而Django中的5MB限制提供了良好的用户体验。
答案 2 :(得分: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])