Python App Engine上传了图像内容类型

时间:2009-09-11 06:53:30

标签: python image google-app-engine upload multipart

我知道我可以接受图片上传,方法是将表格发送到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图片包中看到任何合适的内容。

我应该只在我自己的代码中查找魔术图像标题,还是已经有某种方法可用于某个地方?

编辑:

这是我最终使用的简单解决方案,似乎可以很好地满足我的目的,并且避免必须将图像类型存储为数据存储中的单独字段:

# 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 :(得分:5)

使用self.request.POST [fieldname]而不是使用self.request.get(fieldname)。这将返回一个cgi.FieldStorage对象(有关详细信息,请参阅Python库文档),该对象具有“filename”,“type”和“value”属性。

答案 1 :(得分:2)

尝试使用python mimetypes模块,它将为您猜测内容类型和编码,

e.g。

&gt;&gt;导入mimetypes

&GT;&GT; mimetypes.guess_type( “/家/肖恩/桌面/喜剧/ 30seconds.mp4”)

('video / mp4',无)

答案 2 :(得分:0)

根据我的研究,除了Internet Explorer(至少版本6)之外,浏览器通过使用文件的扩展名来确定文件mime类型。鉴于您需要图像mime类型,您可以使用简单的Python字典来实现此目的。

不幸的是,我不知道Python中的任何方法都试图通过读取一些魔术字节来猜测图像类型(fileinfo在PHP中的方式)。也许您可以使用Google appengine图像API应用EAFP(更容易请求宽恕而不是权限)。

是的,图片API似乎没有告诉您已加载的图片类型。在这种情况下我要做的是构建Python字典以将文件扩展名映射到图像mime类型,而不是尝试加载图像,同时期望NotImageError()异常。如果一切顺利,那么我认为mime类型没问题。