首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取存储在云存储和blobstore中的文件的文件名?

如何获取存储在云存储和blobstore中的文件的文件名?
EN

Stack Overflow用户
提问于 2017-11-23 03:02:27
回答 2查看 1.7K关注 0票数 0

对于一个应用程序,我已经在blobstore和云存储上上传了文件。

我是通过以下方式生成上传链接的:

代码语言:javascript
复制
upload_url = blobstore.create_upload_url('/upload', gs_bucket_name=app_identity.get_default_gcs_bucket_name())

文件同时保存在blobstore和云存储上,我可以执行GQL查询来从blobstore检索任何我想要的文件。但是,我无法找到在云存储中获取文件名的方法。

当文件上传到云存储时,会自动为其分配一个长文件名。

我找到了一个命令,但我不确定如何使用它:https://cloud.google.com/appengine/docs/standard/python/refdocs/google.appengine.ext.blobstore.blobstore#google.appengine.ext.blobstore.blobstore.BlobInfo

当我尝试的时候:

代码语言:javascript
复制
cloud_store = []
for upload in uploads:
     gcs_link = blobstore.BlobInfo(db.get(upload)).gs_object_name
     cloud_store.append(gcs_link)

这里,uploads存储了对具有blobstore.BlobReferenceProperty()属性的种类执行的GQL查询的结果。

我得到了这个错误:

代码语言:javascript
复制
BadArgumentError: Expected an instance or iterable of (<type 'basestring'>, <class 'google.appengine.api.datastore.Entity'>, <class 'google.appengine.api.datastore_types.Key'>); received <models.PhotoAlbum object at 0x00000000054CD7B8> (a PhotoAlbum).

当我尝试的时候:

代码语言:javascript
复制
cloud_store = []
for upload in uploads:
    gcs_link = blobstore.BlobInfo(upload.key()).gs_object_name
    cloud_store.append(gcs_link)

我得到了这个错误:

代码语言:javascript
复制
TypeError: Must provide Entity or BlobKey
EN

回答 2

Stack Overflow用户

发布于 2017-11-23 11:26:08

由于uploads是数据存储查询的结果,这意味着它包含数据存储实体的列表(我假设它不是keys_only查询)。因此,upload就是这样一个实体,它包含blobstore.BlobReferenceProperty()属性(您没有指定它的名称,让我们假设它叫做blob_key)。

如果是这样的话,你需要传递给blobstore.BlobInfo()的是blob键,也就是upload的数据存储实体属性,而不是实体本身的键。所以我会尝试一下(上面关于属性名的假设):

代码语言:javascript
复制
gcs_link = blobstore.BlobInfo(upload.blob_key).gs_object_name
票数 1
EN

Stack Overflow用户

发布于 2021-07-28 01:38:53

通过Java实现的GCS:

您需要Google Cloud Storage服务对象,您可以通过以下a步骤获得该对象:

A.配置

  1. 配置输入,如googleServiceAccountCredentialsprojectId

代码语言:javascript
复制
StorageOptions configureStorageOptions = 
StorageOptions.newBuilder().setProjectId(projectId).setCredentials(googleServiceAccountCredentials).build();

通过步骤1:中的configureStorageOptions获取的

  1. GCS服务对象

代码语言:javascript
复制
Storage getStorage = configureStorageOptions.getService();

因为从上面代码片段中可以看到Google Storage对象。

B.用例

这里我们将举一个例子,上传到Google Storage inside存储桶的文件是基于requestNumber的,即请求号将是Google Storage存储桶中的一个目录。

所以我们必须创建如下代码片段所示的路径:

代码语言:javascript
复制
String path = bucketName.concat("/").concat(requestNumber).concat("/");

备注:

  1. 不要忘记附加/,如上面的路径所示。
  2. 相同的path将在下面的代码片段中引用。

现在你可以参考下面的代码片段,用于从Google Storage帐户获取文件名:

C.从GCS获取文件名的代码片段

代码语言:javascript
复制
List<String> supportingDocuments = new ArrayList<String>();
  try {
            log.info("Get FileName From Path {} With BucketName As {}", path, bucketName);
            Page<Blob> blobs = getStorage().list(bucketName, Storage.BlobListOption.currentDirectory(), Storage.BlobListOption.prefix(path));
            for (Blob blob:blobs.iterateAll()){
                String fileName = blob.getName().replace(path, "");
                supportingDocuments.add(fileName);
            }
        } catch (Exception e){
            log.error(e.getMessage());
        }

备注:

  1. getStorage()方法与ref getStorage的第二点相同,即Storage A. Configure Object
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47442097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档