gpt4 book ai didi

python - 如何在 Django ImageField 中验证图像格式

转载 作者:太空狗 更新时间:2023-10-29 22:30:40 29 4
gpt4 key购买 nike

我们的项目使用 Python 2.7、PIL 1.1.7 和 Django 1.5.1。 ImageField 适用于许多图像格式,包括 bmp、gif、ico、pnm、psd、tif 和 pcx。然而,要求是只允许 png 或 jpg 图像。怎么做到的?

更新。我知道我可以验证文件扩展名和 http Content-Type header 。但是这两种方法都不可靠。我想问的是是否有一种方法可以检查上传的文件内容是否为 png/jpg。

最佳答案

您没有指定是否使用 Django 表单上传图像,我假设是在表单字段中执行验证。

你可以做的是创建一个 django.forms.fields.ImageField 的子类来扩展 to_python 的功能。

目前在to_python中Django中进行的文件类型检查是这样的

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

编辑:我应该指出我没有测试过这个子类。

关于python - 如何在 Django ImageField 中验证图像格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20761092/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com