从自定义域,用户定义的URL和可选的访问控制提供缩略图

时间:2014-02-27 22:43:15

标签: google-app-engine google-cloud-datastore google-cloud-storage blobstore

我想在我的GAE应用程序中添加一个功能,它基本上为应用程序的HRD数据存储区(NDB API)中存储的资源提供类似头像的图像,即每个实体1个图像。在大多数情况下,应用程序只会提供这些图像的小缩略图(100 x 100px,~15kB)。通常,每页有10到40个缩略图。在极少数情况下(少于5%),页面包含对单个图像的较大版本(200 x 200px)的请求。

最重要的要求是,我可以使用每个图像的用户定义(SSL)URL,从与我的应用相同的自定义域提供。图片很少更改,但如果是这样,则网址不得更改。

网址格式: https://www.mydomain.com/img/ 唯一键?S = 100

s参数将指示哪个大小以及 uniqueKey 在哪里表示由图像表示的实体的URL编码的NDB密钥。因此,它是实体和图像之间的一对一关系。顺便说一句,NDB密钥暴露无关紧要。

或者,我认为只为这些图像使用不同的子域是可以接受的,例如: https://img.mydomain.com/ 唯一键?S = 100

另一个要求是提供这些图像是受访问控制(基于webapp2的自定义身份验证),而不是分别是oAuth或Google帐户。据我了解,这意味着我必须实现特定的处理程序,这些处理程序将在处理这些图像的GET请求时消耗前端实例小时数,与数据存储区中的实体相同。

我看到的选项:

BlobProperty

我与每个实体存储的image BlobProperty,可能是两个,每个大小一个。 ImageHandler只会为每个请求获取一个blob,因此它将是一个小的操作。

BLOBSTORE

据我了解,我可以使用自定义身份验证/访问控制来实现图像处理程序。但是,如何使用即使在修改图像时也不会更改的自定义预定义URL。生成的URL看起来随机给我和来自不同的域。

Google云端存储

据我了解,我可以预定义URL,也可以在后台更新图像。但我认为这些都是基于oAuth2的访问控制的公共URL,而且不是自定义域。

似乎BlobProperty可能更昂贵,并且不太方便提供文件,但它是唯一满足所有要求的方法。或者我在这里想念一些东西,我可以选择BlobStore或GCS吗?

1 个答案:

答案 0 :(得分:2)

您可以使用以下任何选项执行此操作。云存储因为它是最便宜的,BlobStore或Blob属性更容易。

您创建一个servlet来处理带有/ image的请求。此servlet使用您在请求中提供的映像ID,查找与此ID关联的Cloud Storage密钥,从Cloud Storage检索文件,并作为响应返回该文件。如有必要,您可以添加一些身份验证逻辑。您将需要一个实体来存储“id - GCS密钥”对。 GCS和App Engine之间的带宽是免费的。

如果您使用BlobStore或Datastore,则可以避免额外的云端存储。使用BlobStore,您仍然需要一个实体来将图像ID与BlobStore密钥相关联。

您还可以将图像存储在Memcache中,并将其ID作为键。这样您就可以避免前往云存储或BlobStore /数据存储区。