将 App Engine Blobkey 解码为 Google Cloud Storage 文件名

Posted

技术标签:

【中文标题】将 App Engine Blobkey 解码为 Google Cloud Storage 文件名【英文标题】:Decode an App Engine Blobkey to a Google Cloud Storage Filename 【发布时间】:2013-10-08 10:26:24 【问题描述】:

我有一个完整的数据库,其中包含以前通过标准 Google App Engine create_upload_url() 流程上传的 BlobKey,并且通过设置 gs_bucket_name 参数,每个上传都进入了同一个 Google Cloud Storage 存储桶。

我想做的是能够解码现有的 blobkey,以便获取它们的 Google Cloud Storage 文件名。我了解我可以一直在使用来自FileInfo class 的gs_object_name 属性,除了:

您必须自己将 gs_object_name 保存在您的上传处理程序中,或者 此数据将丢失。 (GCS 中对象的其他元数据存储在 自动在 GCS 中,因此您无需将其保存在上传处理程序中。

意思是gs_object_name 属性仅在上传处理程序中可用,如果我当时没有保存它,那么它就丢失了。

另外,create_gs_key() 并没有做到这一点,因为它取而代之的是一个 google 存储文件名并创建了一个 blobkey。

那么,如何获取之前通过应用引擎上传到 Google Cloud Storage 存储桶的 blobkey,并获取它的 Google Cloud Storage 文件名? (蟒蛇)

【问题讨论】:

据我所知,您只能重写 blob,这意味着逐字节读取它并再次将其写入云存储,类似于重命名云存储文件,但这次保存的是云存储路径而不是 blobkey .保存云存储对象的 BlobKeys 似乎处于“monkeypatch”状态。 ***.com/questions/18697418/… 【参考方案1】:

您只能在上传处理程序 (fileInfo.gs_object_name) 中获取云存储文件名并将其存储在您的数据库中。之后它就丢失了,并且似乎没有保存在 BlobInfo 或其他元数据结构中。

Google 说:不像 BlobInfo 元数据 FileInfo 元数据不是 持久化到数据存储区。 (也没有 blob 键,但你可以 如果需要,稍后通过调用 create_gs_key 创建一个。)您必须保存 上传处理程序中的 gs_object_name 或此数据将 迷路了。

https://developers.google.com/appengine/docs/python/blobstore/fileinfoclass

更新:我能够在 Blobstore-Viewer 中解码 SDK-BlobKey:“encoded_gs_file:base64-encoded-filename-here”。然而真正的东西不是base64编码的。

create_gs_key(filename, rpc=None) ... Google 说:“将加密的 blob 密钥作为字符串返回。”有谁知道为什么这是加密的?

【讨论】:

可能已加密,因为它包含访问令牌。【参考方案2】:

从文档中的声明来看,生成的 GCS 文件名似乎丢失了。您必须使用 gsutil 手动浏览您的存储桶。

https://developers.google.com/storage/docs/gsutil/commands/ls

【讨论】:

【参考方案3】:

如果你有 blobKeys,你可以使用:ImagesServiceFactory.makeImageFromBlob

【讨论】:

以上是关于将 App Engine Blobkey 解码为 Google Cloud Storage 文件名的主要内容,如果未能解决你的问题,请参考以下文章

从 android 客户端将图像存储到 Blobstore 并检索 blobkey 并上传 url 以存储在 Datastore 中。 - 盖伊

将 GCP App Engine 限制为仅使用 1 个单元的 app engine flex core

将 App Engine Datastore 中的 Blob 显示为图像

Google App Engine(即“纯 Python”):将 PDF 转换为图像

如果我们将 App Engine 配置为自动缩放,它会自动进行负载平衡吗?

python 将pip安装的Python包目录转换为可导入的zip文件,以便在Google App Engine上使用。