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])