Как правильно проверить размер изображения в django? - PullRequest
0 голосов
/ 13 июля 2020

Проблемы возникают из-за сравнения активной загрузки изображения в форму и обновления формы, но не обновления изображения. В форме есть несколько атрибутов, одним из которых является изображение

Когда я загружаю изображение, отлично работает следующее:

file = self.cleaned_data.get('image', False)
if file.image:
    image = file.image
    if image.height > 1920 or image.width > 1080:
        raise ValidationError("Height or Width is larger than what is allowed")
    return file
else:
    raise ValidationError("No image found")

Если я использую тот же код, но не использую загрузить изображение ...

Объект 'ImageFieldFile' не имеет атрибута 'image'

Похоже, когда я загружаю, он находит файл, а не изображение. И когда я не загружаю, он находит изображение, потому что, если я изменю его на:

image = self.cleaned_data.get('image', False)
if image:
    if image.height > 1920 or image.width > 1080:
        raise ValidationError("Height or Width is larger than what is allowed")
    return image
else:
    raise ValidationError("No image found")

, это позволит мне обновить форму, но не изображение.

Теперь, если я попробую тот же код при загрузке изображения, я получу: 'InMemoryUploadedFile' object has no attribute 'height'

Мои попытки исправить эту проблему:

Один:

if file:
    try:
        image = file.image
        print(image.height)  ---> prints [height]
        if image.height > 1920 or image.width > 1080:
            print("val", image.height) ---> prints val [height]
            raise ValidationError("Height or Width is larger than what is allowed")
        return file
    except:
        print("except", file) ---> prints except [file name]
        return file
else:
    raise ValidationError("No image found")

Кажется, это работает до момента проверки. Чтобы уточнить, я тестировал изображения размером 6000x6000 пикселей. Эти проверки работают с первым показанным кодом, но не с попыткой.

Два:

if file:
    try:
        image = file.image
        if image.height > 1920 or image.width > 1080:
            # print("val", image.height)
            raise ValidationError("Height or Width is larger than what is allowed")
        return file
    except:
        image = file
        if image.height > 1920 or image.width > 1080:
            # print("val", image.height)
            raise ValidationError("Height or Width is larger than what is allowed")
        return image
else:
    raise ValidationError("No image found")

Эта попытка номер два почти работает, но не выполняет проверки. Он позволяет мне загружать файлы, размер которых меньше разрешенной высоты и ширины, а также позволяет обновлять форму без загрузки нового файла изображения. Но когда я загружаю изображение больше, чем высота и ширина, я получаю: 'TemporaryUploadedFile' object has no attribute 'height'

Цель состоит в том, чтобы просто гарантировать, что изображения соответствуют указанной c высоте и ширине, а также разрешить отправку формы, даже если изображение не обновлено.

Есть ли что-то, чего мне не хватает есть эта работа и как это может работать?

ОБНОВЛЕНИЕ:

Что работает:

Я заметил, что при обновлении формы я не передавал изображение данные выглядели так:

'image': ['']

После очистки изображение будет отображаться из ранее загруженного изображения в базе данных.

Затем я заметил, что когда изображение было загружено, данные не были есть поле изображения, но оно появится только после его очистки.

Итак, сделаем это:

data_file = self.data.get('image', False)
file = self.cleaned_data.get('image', False)
if data_file == False:
    if file.image:
        image = file.image
        if image.height > 1920 or image.width > 1080:
            raise ValidationError("Height or Width is larger than what is allowed")
        return file
    else:
        raise ValidationError("No image found")
else:
    return file

Позволяет мне проверить, было ли загружено новое изображение или нет, и если да, go через проверку, а если нет, вернуть существующий файл.

Хотя я признаю, это кажется не лучшим способом go об этом.

Если у кого-то есть предложения дайте мне знать

...