在gae-datastore中存储jpg、gif、png等格式

2 投票
2 回答
3019 浏览
提问于 2025-04-16 13:06

我找到一个关于如何在数据存储中保存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 个回答

3

模型文件(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" >
7

简单回答

你可以通过在模型中使用 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 来处理图像,输入和输出的格式是有限制的。

撰写回答