【问题标题】:Google cloud storage Blob.delete() does not create an archive even if versioning is enabled即使启用了版本控制,Google 云存储 Blob.delete() 也不会创建存档
【发布时间】:2019-05-25 16:46:38
【问题描述】:

我正在使用 Google Cloud Storage Java Api 来管理我在 Firebase 上的存储桶。 我已经使用这个命令激活了 gsutil 的版本控制:

gsutil versioning set on gs://[BUCKET_NAME]

之后我尝试用这个 java 代码删除一些文件:

com.google.cloud.storage.Bucket bucket = com.google.firebase.cloud.StorageClient.getInstance().bucket();
com.google.cloud.storage.Blob doc = bucket.get(documentPath);
log.info("Deleting document info => " + doc.toString());
doc.delete();

日志:删除文档信息 => Blob{bucket=[BUCKET_NAME], name=test.pdf, generation=1545929848902866, size=196220, content-type=application/pdf, metadata=null}

这可行,但它会删除文件的实时版本和存档版本。

请问如何只删除实时版本并保存存档的版本?

【问题讨论】:

    标签: java spring google-cloud-platform google-cloud-storage


    【解决方案1】:

    versioning docs 他们说:

    如果您发送的删除请求包含与当前活动对象对应的世代,Cloud Storage 将删除该对象而不制作存档副本。

    所以,使用bucket.get('test.pdf'); 会返回文档及其世代号(您可以在日志中看到它),即使我没有传递世代号。

    解决方案:

    @Bean
    public FirebaseApp provideFirebaseOptions() throws IOException {
        log.info("INIT FIRBASE");
        FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(apiKey.getInputStream()))
                .setStorageBucket(bucketPath)
                .build();
        return FirebaseApp.initializeApp(options);
    }
    // add this bean to provide StorageOptions service
    @Bean
    public Storage provideStorageService() throws IOException {
        log.info("INIT STORAGE");
        return StorageOptions.newBuilder()
                .setCredentials(ImplFirebaseTrampolines.getCredentials(provideFirebaseOptions()))
                .build()
                .getService();
    }
    

    获取和删除文档:

    //autowire storage bean
    private final Storage storage;
    public StorageService(Storage storage) {this.storage = storage;}
    ...
    BlobId blobId = BlobId.of(StorageClient.getInstance().bucket().getName(), documentPath);
    log.info("Deleting document info => " + blobId.toString());
    storage.delete(blobId);
    

    【讨论】:

      【解决方案2】:

      您正在关闭版本控制。 enable versioning 的正确命令是:

      gsutil 版本控制设置开启 gs://[BUCKET_NAME]

      【讨论】:

      • 谢谢@Omair,但这是一个打字错误,我只是纠正它。
      猜你喜欢
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 2021-01-28
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      相关资源
      最近更新 更多