【问题标题】:Migrating from App Engine Files API从 App Engine 文件 API 迁移
【发布时间】:2015-08-05 17:08:30
【问题描述】:

我的应用程序将一堆图像存储为 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 Cloud Storage?换句话说,我能否使用 GCS 客户端库和现有的 blob 密钥访问我现有的 blob?或者,我是否必须将 blob 复制到 GCS 并获取新的 blob 密钥?
  2. 假设我必须将它们复制到 GCS,最简单的方法是什么?有迁移工具之类的吗?如果做不到这一点,是否有一些我可以复制粘贴的示例代码?

谢谢!

【问题讨论】:

    标签: google-app-engine google-app-engine-python


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • Cloudstorage Files API 已于 2013 年 5 月 21 日弃用,移除日期为 2015 年 7 月 28 日。
      【解决方案3】:

      我在 2015 年 5 月 19 日收到了一封来自 Google Cloud Platform 的电子邮件,此处显示摘录:

      文件 API 的删除将通过以下方式进行。

      2015 年 5 月 20 日,新应用程序将无法访问文件 API。在 2015 年 5 月 20 日之前创建的应用程序将 继续运行没有任何问题。也就是说,我们强烈鼓励 开发人员开始切换到 Cloud Storage 客户端库 今天。

      从 2015 年 7 月 28 日太平洋时间下午 12 点开始,文件 API 将 暂时关机24小时。

      2015 年 8 月 4 日,我们将永久关闭 Files API 太平洋时间下午 12:00。

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

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

      【讨论】:

        【解决方案4】:

        我在本地运行 GAE 服务器时也遇到了同样的问题:

        com.google.appengine.tools.cloudstorage.NonRetriableException:com.google.apphosting.api.ApiProxy$FeatureNotEnabledException:文件 API 已禁用。更多信息:https://cloud.google.com/appengine/docs/deprecations/files_api

        在我的情况下,这解决了我的问题:

        只是我改变了

        这个:

        编译'com.google.appengine.tools:appengine-gcs-client:0.4.1'

        收件人:

        编译'com.google.appengine.tools:appengine-gcs-client:0.5'

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多