【问题标题】:How to migrate from The Files API to Google Cloud Storage?如何从 Files API 迁移到 Google Cloud Storage?
【发布时间】:2015-08-01 07:49:51
【问题描述】:

我昨天收到 Google 的一条消息,说 Files API 将于 7 月 28 日停用,建议迁移到 Google Cloud Storage。

目前我通过以下方式使用 Files API - 收到电子邮件后,我将其附件(仅限图像)保存到 blobstore -

from google.appengine.api import files

bs_file = files.blobstore.create(mime_type=ctype, _blobinfo_uploaded_filename='screenshot_'+image_file_name)
try:
    with files.open(bs_file, 'a') as f:
        f.write(image_file)
    files.finalize(bs_file)
    blob_key = files.blobstore.get_blob_key(bs_file)

稍后,我访问 blobstore 并将相同的图像附加到我发送的另一封邮件中:

attachments = []
for at_blob_key in message.attachments:
    blob_reader = blobstore.BlobReader(at_blob_key)
    blob_info = blobstore.BlobInfo.get(at_blob_key)
    if blob_reader and blob_info:
        filename = blob_info.filename
        attachments.append((filename, blob_reader.read()))
if len(attachments) > 0:
    email.attachments = attachments
email.send()

现在,我应该使用 Google Cloud Storage 而不是 Blobstore。谷歌云存储不是免费的,所以我必须启用计费。目前我的 Blobstore 存储数据是 0.27Gb,很小,所以看起来我不需要支付很多费用。但我害怕启用计费,因为我的代码的其他一些部分可能会导致巨额账单(而且似乎没有办法仅为 Google Cloud Storage 启用计费)。

那么,在我的情况下,有什么方法可以继续使用 Blobstore 进行文件存储?除了 Google Cloud Storage(Google Drive 是什么),我还能免费使用什么?

【问题讨论】:

  • 您将能够使用 blobstore 但不能使用文件 API。至少我是这样理解的。因此,您可以更改为使用具有blobstore.BlobReferenceProperty() 的类并像这样保存它。
  • @Niklasinstockholm,接下来的问题是如何将文件保存到 blobstore(目前使用 Files API 完成)。
  • 顺便说一句,通过启用计费,您不会收到“巨额账单”。您的应用已经符合免费配额,因此免费部件将保持免费,您只需为额外服务付费
  • @IgorArtamonov,部分同意,但随着用户活动的增加,代码中进行了一些更改,一旦启用计费,我可能会收到巨额账单(我现在无法收到,因为 Over Quota 例外发生了,就是这样)。
  • 启用结算后,您可以设置最高每日预算。将其设置为 1 美元,它足够接近释放,您不必担心它。

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


【解决方案1】:

以下示例使用 GCS 默认存储桶来存储您的屏幕截图。默认存储桶有免费配额。

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

default_bucket = app_identity.get_default_gcs_bucket_name()
image_file_name = datetime.datetime.utcnow().strftime('%Y%m%d%H%M%S') + '_' + image_file_name # GCS filename should be unique
gcs_filename = '/%s/screenshot_%s' % (default_bucket, image_file_name)
with gcs.open(gcs_filename, 'w', content_type=ctype) as f:
    f.write(image_file)

blob_key = blobstore.create_gs_key('/gs' + gcs_filename)
blob_key = blobstore.BlobKey(blob_key) # if should be stored in NDB

【讨论】:

  • 谢谢(很抱歉这么晚更新)。我正在阅读文档但无法理解 - 我是否应该修改与从 Blobstore/GCS 读取数据相关的内容?我可以保留blob_reader = blobstore.BlobReader(at_blob_key); blob_info = blobstore.BlobInfo.get(at_blob_key); blob_reader.read() 吗?它会根据键值自动识别数据存储在 GCS 中(通过/gs 前缀)吗?它会自动处理存储在 Blobstore 中的旧数据(没有 /gs 前缀)吗?
  • 还有一个问题 - 不太清楚 create_gs_key 的工作原理。什么是filename 传递的不是唯一的?
  • 您可以保留 BlobReader 并使用您的 blobstore 中的数据。是的,当您使用 blobstore 来处理 GCS 中的文件时,您必须使用使用 create_gs_key 创建的 blobkey。
  • 如果我保存第一个名称为1.jpg 的文件,然后保存第二个名称为1.jpg 的文件。 create_gs_key 会生成两个不同的密钥吗?顺便说一句,我无法将收到的 blob_key 保存到 NDB - BadValueError: Expected BlobKey, got 'AMIfv95...'。
  • 查看console.developers.google.com/project/ros-spam/storage/browser/… 并尝试使用两个不同的文件,它会用新文件覆盖旧文件。所以,我还应该生成唯一的文件名。
猜你喜欢
  • 1970-01-01
  • 2016-05-25
  • 2016-01-11
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多