Максимальный размер изображения при загрузке файла - PullRequest
43 голосов
/ 01 июня 2011

У меня есть ImageField в моей форме. Как бы я ввел размер файла мин / макс, что-то вроде -

image = forms.ImageField(max_size = 2MB) 

или

image = forms.ImageField(min_size = 100k)

Спасибо.

Ответы [ 3 ]

52 голосов
/ 01 июня 2011

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")
47 голосов
/ 01 июня 2011

По сути, это дубликат Ограничение размера загрузки файла Django

У вас есть два варианта:

  1. Используйте проверку в Django, чтобы проверитьразмер загружаемого файла.Проблема с этим подходом состоит в том, что файл должен быть загружен полностью, прежде чем он будет проверен.Это означает, что если кто-то загрузит файл размером 1 ТБ, вам, вероятно, не хватит места на жестком диске, прежде чем пользователь получит ошибку формы.

  2. Настройте веб-сервер так, чтобы ограничить допустимое тело загрузкиразмер.например, если вы используете Apache, установите настройку LimitRequestBody.Это будет означать, что если пользователь попытается загрузить слишком много, он получит страницу с ошибкой, настраиваемую в Apache

Как говорит @pastylegs в комментариях, использование комбинации обоих, вероятно, являетсялучший подход.Допустим, вы хотите максимум 5 МБ, возможно, установить ограничение в 20 МБ на уровне веб-сервера и ограничение в 5 МБ на уровне Django.Ограничение в 20 МБ обеспечит некоторую защиту от злонамеренных пользователей, а ограничение в 5 МБ в Django обеспечивает хороший UX.

23 голосов
/ 06 января 2014

Вот еще один вариант, который я не видел во всех вариациях этого вопроса в 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])
...