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

时间:2017-11-22 19:02:27

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

对于应用程序,我在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

2 个答案:

答案 0 :(得分:1)

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

如果需要,您需要传递给blobstore.BlobInfo()的是blob密钥,即upload的数据存储区实体属性,而不是实体本身的密钥。所以我尝试(使用上面关于属性名称的假设):

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

答案 1 :(得分:0)

通过 Java 的 GCS:

您需要可以通过以下步骤获取的 Google Cloud Storage 服务对象:

A.配置

  1. 配置输入,如 googleServiceAccountCredentialsprojectId
StorageOptions configureStorageOptions = 
StorageOptions.newBuilder().setProjectId(projectId).setCredentials(googleServiceAccountCredentials).build();
  1. GCS 服务对象通过 configureStorageOptions 从步骤 1 中获取:
Storage getStorage = configureStorageOptions.getService();

因为从上面的代码片段你有谷歌存储对象。

B.用例

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

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

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

注意:

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

现在您可以参考以下代码片段从 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 point 2 as ref getStorageStorage Java Object