TInyPNG与Google App Engine数据存储集成

时间:2015-09-20 08:37:14

标签: google-app-engine google-cloud-datastore image-compression

我需要从不同的网址获取图片,并在压缩后将其存储在Google Datastore中。我知道tinyPNG是一个很好的API来进行压缩,但API只支持Amazon S3。

有人可以指导如何在Google App Engine中完成此操作。

2 个答案:

答案 0 :(得分:3)

您提到的仅限S3支持仅适用于直接从服务器上传压缩图像(即不通过应用程序进行图像压缩请求),这只是一个方便的功能。来自the tinypng docs

  

上传到Amazon S3

     

您可以告诉Tinify API直接将压缩图像上传到   亚马逊S3。如果您使用S3来托管图像,这可以节省您的麻烦   将图像下载到服务器并将其上传到S3   自己。

您的应用应该能够使用其REST API下载压缩图像并将其保存到数据存储区。

答案 1 :(得分:1)

由于Google App Engine是只读的,因此您无法使用内置的镀锡功能将文件写入其中。但是,您可以在App Engine中使用blob存储。确保您的GAE应用程序中的libs文件夹中有tinify代码和请求模块(镀锌使用)。我需要2.3版本的请求才能使tinify工作。

要使用GAE使用图像存储,请为具有blob存储的实体定义数据库模型,如:

from google.appengine.ext import ndb

class Image(ndb.Model):
    img = ndb.BlobProperty()

现在我们需要一个tinify函数来写入实体的blob存储而不是写入文件。您可以镜像现有的镀锡代码以写入文件:

source.py文件中,添加此方法:

from google.appengine.ext import ndb

class Source(object):
    ...
    def to_blob(self, key):
        return self.result().to_blob(key)
    ...

result.py文件中添加此方法:

from google.appengine.ext import ndb

class Result(ResultMeta):
    ...
    def to_blob(self, key):
        img_store = key.get()
        img_store.img = self.data
    ...

现在,tinify可以在GAE中写下您可以随意提供的服务。您只需创建一个实体,将密钥传递给Source.to_blob()方法,您的实体现在将存储压缩图像。所以现在你可以这样做:

class Basepage(webapp2.RequestHandler):
    def post(self):
    ...
        img_store = Image()
        img_key = img_store.put()

        # Use URL for image to be compressed
        source = tinify.from_url("http://...")
        source.to_blob(img_key)

        compressed_img_store = img_key.get()

        self.response.headers['Content-Type'] = 'image/png'
        self.response.out.write(compressed_img_store.img)