在gae-datastore中存储jpg、gif、png等格式
我找到一个关于如何在数据存储中保存png格式图片的示例:
img = images.Image(img_data)
# Basically, we just want to make sure it's a PNG
# since we don't have a good way to determine image type
# through the API, but the API throws an exception
# if you don't do any transforms, so go ahead and use im_feeling_lucky.
img.im_feeling_lucky()
png_data = img.execute_transforms(images.PNG)
img.resize(60, 100)
thumbnail_data = img.execute_transforms(images.PNG)
Picture(data=png_data,
thumbnail_data=thumbnail_data).put()
这段代码让我很困惑,但它确实可以处理png格式的图片。不过,我该怎么做才能保存其他常见的图片格式(比如jpg、gif、tiff等)呢?
2 个回答
模型文件(models.py)
class Profile(db.Model):
avatar=db.BlobProperty()
视图文件(views.py)
if(self.request.get):
image = self.request.get('MyFile')
if image:
mime=self.request.POST['MyFile'].type
mime=mime.split('/')
icon_image = db.Blob(images.resize(image,460,460))
prof.avatar = db.Blob(icon_image)
if mime[1]== 'jpeg' or 'jpg' or 'gif' or 'png':
prof.put()
显示图片
class disp_image(webapp.RequestHandler):
def get(self):
if profile.avatar is not None:
image = view_profile.avatar
self.response.headers['Content-Type'] = "image/png"
return self.response.out.write(image)
模板文件
<img id="crop" src='/module/disp_image' alt="profile image" >
简单回答
你可以通过在模型中使用 db.BlobProperty()
来存储任何文件类型的二进制数据。
如果你使用 Image
API 来处理图像数据,那么你只能输入 .jpg
、.png
、.gif
、.bmp
、.tiff
和 .ico
格式的文件,并且只能输出为 .jpg
或 .png
格式。
存储图片
如果你只是想把图片存储在数据存储中,可以在模型中使用 db.BlobProperty()
,这样就可以存储图片的二进制数据。这就是你链接的示例代码中数据存储的方式(见 第85行)。
因为 db.BlobProperty
这个类型本身并不是图片,而是可以存储任何二进制数据,所以在使用时需要一些规范;没有简单的方法来强制限制只能存储图片。幸运的是,这意味着你可以存储任何类型的数据,包括 .jpg
、.gif
、.tiff
等文件,当然也包括 .png
格式,正如示例中所示。
你可能会想像示例中那样,为模型创建一个新类,并存储一些文件所需的元数据(比如“名称”、“文件类型”等),除了图片的二进制数据。你可以在你链接的示例中看到这个的例子,见 第65行。
要将图片存储到 BlobProperty
中,你需要使用 db.put()
来保存数据;这和存储任何类型的数据是一样的。可以查看你链接的示例代码中从 第215行 开始的代码。
处理图片
如果你需要处理图片,可以使用 Images API 包。从 Images API 概述 中我们可以看到以下内容:
该服务接受 JPEG、PNG、GIF(包括动画 GIF)、BMP、TIFF 和 ICO 格式的图像数据。
它可以返回 JPEG 和 PNG 格式的转换后图像。如果输入格式和输出格式不同,服务会在进行转换之前将输入数据转换为输出格式。
所以虽然从技术上讲你可以在数据存储中存储任何类型的数据,但如果你使用这个 API 来处理图像,输入和输出的格式是有限制的。