Django - Как проверить, что загруженное изображение имеет правильный тип расширения и не повреждено

Ниже приведен код для проверки загружаемого файла изображения. Основные проблемы с этим способом проверки в том, что пользователь может просто изменить расширение и загрузить недействительное изображение, что вызовет проблемы на front-end, потому что если он попытается его отобразить, то не сможет. Есть ли способ проверить, загружен ли правильный файл изображения в Django? Или, может быть, все в порядке, и то, что изображение не отображается на внешнем интерфейсе, является ожидаемым поведением, когда пользователь загружает неправильный файл изображения.

VALID_IMAGE_EXTENSIONS = ('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif')
upper_image_extensions = tuple([string.upper() for string in VALID_IMAGE_EXTENSIONS])
VALID_IMAGE_EXTENSIONS += upper_image_extensions

def validate_image_upload(file):
    if not isinstance(file, InMemoryUploadedFile):
        raise ValidationError("Is not InMemoryUploadedFile")

    if not is_valid_file_of_format(file._name, VALID_IMAGE_EXTENSIONS):
        raise ValidationError("Image file format is invalid")

Для этого существует валидатор django. Смотрите документацию здесь.

Вы также можете создать свою собственную функцию валидатора, например, так:

def custom_validator(value):
    valid_formats = ['png', 'jpeg']
    if not any([True if value.name.endswith(i) else False for i in valid_formats]):
        raise ValidationError(f'{value.name} is not a valid image format')

и передайте его полю в качестве валидатора:

class MyClass(models.Model):
    image = models.ImageField('Image', upload_to=path, validators=[custom_validator])
Вернуться на верх