将jpg,gif,png等存储为gae-datastore

时间:2011-03-06 16:33:08

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

我找到了关于如何在数据存储中存储png的example

  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 个答案:

答案 0 :(得分:7)

快速回答

您可以在模型中使用db.BlobProperty()存储任何文件类型的二进制数据。

如果您使用Image API来操作图片数据,则只能输入.jpg.png.gif.bmp,{ {1}}和.tiff类型,并输出到.ico.jpg


存储图像

要简单地将图像存储在数据存储中,请在模型中使用.png,并将其存储为图片的二进制数据。这是数据存储在您链接到的示例代码中的方式(参见Line 85)。

因为类型db.BlobProperty()类型本身不是图片,但可以存储任何二进制数据,所以需要一些规则;没有简单的方法来以编程方式强制执行仅限图片的约束。幸运的是,这意味着您可以存储任何类型的数据,包括db.BlobProperty.jpg.gif等文件以及.tiff格式,如例子。

您可能希望像示例中那样为模型创建一个新类,并存储文件所需的某些元数据(“名称”,“文件类型”等),以及图像的二进制数据。您可以在链接到的示例中的Line 65处查看此示例。

要将图像存储在.png中,您需要使用BlobProperty来保存数据;这与任何类型相同。请参阅您链接到的示例代码中Line 215开头的代码。


操纵图像

如果您必须操纵图像,则可以使用Images API包。从Overview of the Images API我们可以看到以下内容:

  

该服务接受JPEG,PNG,GIF(包括动画GIF),BMP,TIFF和ICO格式的图像数据。

     

它可以返回JPEG和PNG格式的变换图像。如果输入格式和输出格式不同,服务会在执行转换之前将输入数据转换为输出格式。

因此,即使您可以在技术上将任何类型存储在数据存储区中,但如果您使用此API来处理图像,则有效的输入和输出类型将受到限制。

答案 1 :(得分: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" >