Вы не указали, используете ли вы форму Django для загрузки изображения, я предполагаю, что он находится в поле формы, которое выполняется валидацией.
Что вы можете сделать, это создать подкласс django.forms.fields.ImageField
, чтобы расширить функциональность to_python.
Файл проверки типа в настоящее время осуществляется в Django в to_python
выглядит следующим образом
Image.open(file).verify()
Ваш подкласс может выглядеть примерно так.
class DmitryImageField(ImageField):
def to_python(self, data):
f = super(DmitryImageField, self).to_python(data)
if f is None:
return None
try:
from PIL import Image
except ImportError:
import Image
# We need to get a file object for PIL. We might have a path or we might
# have to read the data into memory.
if hasattr(data, 'temporary_file_path'):
file = data.temporary_file_path()
else:
if hasattr(data, 'read'):
file = BytesIO(data.read())
else:
file = BytesIO(data['content'])
try:
im = Image.open(file)
if im.format not in ('BMP', 'PNG', 'JPEG'):
raise ValidationError("Unsupport image type. Please upload bmp, png or jpeg")
except ImportError:
# Under PyPy, it is possible to import PIL. However, the underlying
# _imaging C module isn't available, so an ImportError will be
# raised. Catch and re-raise.
raise
except Exception: # Python Imaging Library doesn't recognize it as an image
raise ValidationError(self.error_messages['invalid_image'])
if hasattr(f, 'seek') and callable(f.seek):
f.seek(0)
return f
Вы можете заметить, что это большая часть кода из ImageField.to_python
и может предпочесть просто создать подкласс FileField использовать вместо ImageField
вместо подклассов ImageField
и дублируя большую часть своей функциональности. В этом случае перед проверкой формата обязательно добавьте im.verify()
.
EDIT: Я должен указать, что я не тестировал этот подкласс.
Я знаю, что вы можете поместить некоторые подтверждения в настройках своей формы. Я расскажу вам подробности. –
См. Этот [ответ] (http://stackoverflow.com/questions/4853581/django-get-uploaded-file-type-mimetype?answertab=active#tab-top) и этот [link] (https: // docs .djangoproject.ком/ен/DEV/темы/HTTP/закачка файлов/# uploadedfile-объектов). –