У меня есть ImageField в моей форме. Как я могу применить размер файла min/max, что-то вроде -
image = forms.ImageField(max_size = 2MB)
или
image = forms.ImageField(min_size = 100k)
Спасибо.
У меня есть ImageField в моей форме. Как я могу применить размер файла min/max, что-то вроде -
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")
По сути, это дубликат Ограничения размера загрузки файла Django
У вас есть два варианта:
Используйте проверку в Django для проверки размера загруженного файла. Проблема с этим подходом заключается в том, что файл должен быть загружен полностью, прежде чем он будет проверен. Это означает, что если кто-то загрузит файл 1 ТБ, у вас, вероятно, закончится нехватка жесткого диска, прежде чем пользователь получит ошибку формы.
Настройте веб-сервер для ограничения разрешенного размера тела загрузки. например если вы используете Apache, установите параметр LimitRequestBody
. Это будет означать, что если пользователь попытается загрузить слишком много, они получат страницу с ошибкой, настраиваемую в Apache
Как сообщают @pastylegs в комментариях, использование комбинации обоих, вероятно, является лучшим подходом. Предположим, вы хотите максимум 5 МБ, возможно, применяете ограничение на 20 МБ на уровне веб-сервера и ограничение 5 МБ на уровне Django. Ограничение на 20 МБ обеспечит некоторую защиту от вредоносных пользователей, а предел 5 МБ в Django обеспечивает хороший UX.
Вот еще один вариант, который я не видел в вариациях этого вопроса в stackoverflow: используйте собственный валидатор в своих моделях. Если вы используете этот метод и ModelForm в forms.py, тогда это должно быть все, что вам нужно.
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])