对于应用程序,我在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
答案 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.配置
googleServiceAccountCredentials
和 projectId
StorageOptions configureStorageOptions =
StorageOptions.newBuilder().setProjectId(projectId).setCredentials(googleServiceAccountCredentials).build();
configureStorageOptions
从步骤 1 中获取:Storage getStorage = configureStorageOptions.getService();
因为从上面的代码片段你有谷歌存储对象。
B.用例
这里我们举一个例子,上传到存储桶内 Google Storage 的文件是基于 requestNumber
,即请求号将是 Google Storage 存储桶中的一个目录。
所以我们必须创建如下代码片段所示的路径:
String path = bucketName.concat("/").concat(requestNumber).concat("/");
注意:
/
。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());
}
注意:
getStorage()
方法是相同的,其中提到 A. Configure
point 2 as ref getStorage
即 Storage
Java Object