【问题标题】:How to get filename of files stored in cloud storage and blobstore?如何获取存储在云存储和 blobstore 中的文件的文件名?
【发布时间】:2017-11-22 19:02:26
【问题描述】:

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

我这样做是通过以下方式生成上传链接:

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

当我尝试时:

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 查询的结果。

我收到此错误:

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).

当我尝试时:

cloud_store = []
for upload in uploads:
    gcs_link = blobstore.BlobInfo(upload.key()).gs_object_name
    cloud_store.append(gcs_link)

我收到此错误:

TypeError: Must provide Entity or BlobKey

【问题讨论】:

    标签: google-cloud-platform google-cloud-storage blobstore


    【解决方案1】:

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

    如果是这样,您需要传递给 blobstore.BlobInfo() 的内容必须是 blob 键,即 upload 的数据存储实体属性,而不是实体本身的键。所以我会尝试(使用上述关于属性名称的假设):

    gcs_link = blobstore.BlobInfo(upload.blob_key).gs_object_name
    

    【讨论】:

    • 这给了我错误:TypeError: Must provide Entity or BlobKey。但是,我找到了解决方案:gcs_link = blobstore.BlobInfo(upload.blob_key.key()).gs_object_name
    【解决方案2】:

    通过 Java 的 GCS:

    您需要谷歌云存储服务对象,您可以通过以下步骤获得:

    A.配置

    1. googleServiceAccountCredentialsprojectId这样的配置输入
    StorageOptions configureStorageOptions = 
    StorageOptions.newBuilder().setProjectId(projectId).setCredentials(googleServiceAccountCredentials).build();
    
    1. GCS服务对象通过configureStorageOptions从Step 1获取:
    Storage getStorage = configureStorageOptions.getService();
    

    由于从上面的代码 sn-p 你有谷歌存储对象。

    B.用例

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

    所以我们必须创建路径,如下面的代码sn-p:

    String path = bucketName.concat("/").concat(requestNumber).concat("/");
    

    注意:

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

    现在您可以参考以下代码 sn-p 从 Google 存储帐户中获取文件名:

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

    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() 方法与 A. Configure 点 2 中提到的相同 getStorageStorage Java 对象

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-02
      • 2019-08-08
      • 2012-01-30
      • 2012-08-12
      • 2021-05-23
      • 2012-02-26
      • 1970-01-01
      • 2021-10-05
      相关资源
      最近更新 更多