Python App Engine上传图像内容类型

4 投票
3 回答
2910 浏览
提问于 2025-04-15 14:14

我知道我可以通过一个表单来接受图片上传,这个表单会把数据发送到App Engine,像这样:

<form action="/upload_received" enctype="multipart/form-data" method="post">
<div><input type="file" name="img"/></div>
<div><input type="submit" value="Upload Image"></div>
</form>

然后在Python代码中,我可以做一些类似的事情:

image = self.request.get("img")

但是,我该怎么知道这个图片的内容类型是什么,以便在后面展示给用户呢?看起来最可靠的方法是从图片的数据本身来判断,但我该怎么简单地获取这些信息呢?我在google.appengine.api images这个包里没有找到合适的东西。

我是不是应该在自己的代码里查找那些神奇的图片头信息,还是说已经有现成的方法可以用呢?

编辑:

这是我最终使用的简单解决方案,似乎对我来说效果不错,而且避免了在数据存储中单独存储图片类型:

# Given an image, returns the mime type or None if could not detect.
def detect_mime_from_image_data(self, image):
    if image[1:4] == 'PNG': return 'image/png'
    if image[0:3] == 'GIF': return 'image/gif'
    if image[6:10] == 'JFIF': return 'image/jpeg'
    return None

3 个回答

0

根据我的研究,除了Internet Explorer(至少是6版本)之外,其他浏览器是通过文件的扩展名来判断文件的类型的。如果你想要获取图片的类型,可以用一个简单的Python字典来实现这个功能。

不过,我不知道Python有没有什么方法可以通过读取一些特定的字节来猜测图片的类型(就像PHP中的fileinfo那样)。也许你可以用EAFP原则(即“先尝试再说,不要事先询问”)来处理Google appengine的图片API。

是的,看起来这个图片API并不会告诉你你加载的图片是什么类型。在这种情况下,我会创建一个Python字典,把文件扩展名和图片类型对应起来,然后尝试加载图片,同时期待会出现一个NotImageError()的错误。如果一切顺利,那我就可以假设这个图片类型是正确的。

2

试试Python的mimetypes模块,它可以帮你猜测文件的内容类型和编码。

比如:

>>import mimetypes

>>mimetypes.guess_type("/home/sean/desktop/comedy/30seconds.mp4")

('video/mp4', None)

5

不要用 self.request.get(fieldname) 这种方式,改用 self.request.POST[fieldname]。这样做会返回一个叫做 cgi.FieldStorage 的对象(想了解更多可以查阅 Python 的库文档),这个对象里面有 'filename'、'type' 和 'value' 这些属性。

撰写回答