【问题标题】:How to read data from Google Cloud Storage based on its blobkey?如何根据其 blobkey 从 Google Cloud Storage 读取数据?
【发布时间】:2024-05-29 12:05:01
【问题描述】:

我早期使用 Files API 将数据保存到 blobstore,然后使用以下代码读取它:

resource = blob_key
blob_info = blobstore.BlobInfo.get(resource)
if blob_info:
    self.send_blob(blob_info)
else:
    self.response.write('Blob entry not found')

文档说,在许多情况下,我可以继续使用 blobstore API 来使用 Google Cloud Storage。但是上面的代码返回的blob_info 等于None

按照the documentation,我应该直接从blobstore读取数据,但是下面的代码也不适用于GCS(Blob entry not found),但适用于blobstore文件:

class BlobstoreServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
  def get(self, resource):
    resource = str(urllib.unquote(resource))
    blob_info = blobstore.BlobInfo.get(resource)
    if blob_info: # blobstore files
        self.send_blob(blob_info)
    elif blobstore.get(resource): # Google Cloud Storage files
        self.send_blob(resource)
    else:
        self.response.write('Blob entry not found')

【问题讨论】:

  • 使用 GCS 你没有 blob_info 对象。将 self.send_blob(blob_key) 与 gs blobkey 一起使用,或使用 gcs_filename 从 GCS 下载
  • 谢谢,@voscausa。我已经更新了问题。

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


【解决方案1】:

使用 Blobstore 下载 blobfile 和 GCS 文件的示例代码

您已将文件名和 blobkey 保存在 db.Model YourFiles 实体中:

your_file = YourFiles.get_by_key_name(key_name)
# blob_ref is a blobstore.BlobReferenceProperty()
download_url = '/blob_serve/%s?save_as=%s' % (your_file.blob_ref.key(), your_file.file_name)
self.redirect(download_url)   # download using the handler below


class BlobServe(blobstore_handlers.BlobstoreDownloadHandler):          

    def get(self, resource):
        """ use blob_key to download GCS and blobstore blobs """

        blob_key = str(urllib.unquote(resource))
        save_as = self.request.get('save_as')
        self.send_blob(blob_key, save_as=save_as)    

【讨论】:

  • 谢谢。我将密钥存储为 ndb.BlobKeyProperty(repeated=True) (无法修改现有数据库), blobstore.BlobKey(blobstore.create_gs_key(...)) 。这可能是我遇到问题的原因吗?
  • 嗯,问题出在blobstore.get(resource) - 当send_blob 返回正确的文件时,它返回None。现在我应该实现一些方法来处理blob not found 案例。
【解决方案2】:

您如何写入 Google Cloud Storage?使用时未创建 BlobInfo appengine gcs client。对于此类文件,您仍然可以使用 blobstore.create_gs_key 创建 Blob 键,但这些键没有关联的 BlobInfo。

【讨论】: