从 App Engine 文件迁移 API

Migrating from App Engine Files API

我的应用程序将一堆图像存储为 blob。这就是我存储图像的大致方式。

from google.appengine.api import files
# ...
fname = files.blobstore.create(mime_type='image/jpeg')
with files.open(fname, 'a') as f:
  f.write(image_byte)
files.finalize(fname)
blob_key = files.blobstore.get_blob_key(fname)

为了提供这些图像,我使用 images.get_serving_url(blob_key)

这是我的问题:

  1. 我是否必须将所有 blob 复制到 Google 云存储?换句话说,我是否能够使用 GCS 客户端库和现有的 blob 密钥访问现有的 blob?或者,我是否必须将 blob 复制到 GCS 并获取新的 blob 密钥?
  2. 假设我必须将它们复制到 GCS,最简单的方法是什么?有没有迁移工具之类的?如果做不到,是否有一些示例代码我可以复制粘贴?

谢谢!

这些文件已经全部进入 GCS 一段时间了。 blobstore 只是访问它的另一种方式。 blob 密钥和访问权限不应受到影响。

但是,您将需要停止使用文件 API 本身并开始使用 GCS API 来创建文件。

1) 不,您仍然可以使用 blobstore。您还可以在使用 BlobstoreUploadHandler 时将文件上传到 blobstore。

2) 使用 blobstore 时迁移很容易,因为您可以为 GCS 对象创建 blobkey。当您使用默认的 GCS 桶时,您将获得免费配额。

from google.appengine.api import app_identity
import cloudstorage as gcs

default_bucket = app_identity.get_default_gcs_bucket_name() 
gcs_filename = '/%s/%s' % (default_bucket, image_file_name)
with gcs.open(gcs_filename, 'w', content_type='image/jpeg') as f:
    f.write(image_byte)

blob_key = blobstore.create_gs_key('/gs' + gcs_filename)
# and create a serving url

我在 2015 年 5 月 19 日收到来自 Google Cloud Platform 的电子邮件,摘录如下:

The removal of the Files API will happen in the following manner.

On May 20th, 2015 no new applications will have access to the Files API. Applications that were created prior to May 20th, 2015 will continue to run without any issues. That said, we strongly encourage developers to start switching over to the Cloud Storage Client Library today.

On July 28th, 2015 starting at 12pm Pacific Time, the Files API will be temporarily shutdown for 24 hrs.

On August 4th, 2015, we will permanently shut down the Files API at 12:00pm Pacific time.

由于我使用完全相同的代码编写 blobstore 文件,因此我花了一天时间研究 GCS 系统。在未能使 "service account" 工作后(通过记录不充分的 OAuth2 混淆),我放弃了使用 GCS。

现在我正在使用 ndb 的 BlobProperty。我使用父键和键名(作为文件名)将 blob 保存在单独的模型中以定位图像。使用单独的模型可以将巨大的 blob 排除在我的常规实体之外,因此获取不会因其庞大的大小而减慢。我专门为图像写了一个单独的 REST API。

我在本地 运行 GAE 服务器时也面临同样的问题:

com.google.appengine.tools.cloudstorage.NonRetriableException: com.google.apphosting.api.ApiProxy$FeatureNotEnabledException: The Files API is disabled. Further information: https://cloud.google.com/appengine/docs/deprecations/files_api

在我的案例中,这是解决了我的问题:

干脆我改了

这个:

compile 'com.google.appengine.tools:appengine-gcs-client:0.4.1'

收件人:

compile 'com.google.appengine.tools:appengine-gcs-client:0.5'

build.gradle 文件中,因为文件 API(测试版)已于 2013 年 6 月 12 日弃用并于 2015 年 9 月 9 日关闭。(Source)

来自这个 MVN Repo 最新的是 'com.google.appengine.tools:appengine-gcs-client:0.5'