Azure 存档层覆盖文件 [Java]

Azure Archive tier overwrite files [Java]

提问人:Vicente Montoro 提问时间:10/25/2023 更新时间:10/26/2023 访问量:41

问:

我正在测试覆盖 Azure 上存档层存储的任何文件,但出现下一个错误(其他层没有问题):

错误:文件上传失败 com.azure.storage.blob.models.BlobStorageException:BlobArchived

我用来复制文件的方法是:

blob.uploadWithResponse(..);或者 blob.uploadFromFile(..);

目前有没有一种简单的方法可以避免此问题并覆盖文件,或者存档层文件无法覆盖?我手动测试(从 Azure 存储),它询问你是否覆盖数据。也许 Java 中有一些方法可以做到这一点,但我找不到它。

提前致谢!

我试图找到一种方法来覆盖 Java 中存档层文件的数据

Java Azure 存档 覆盖

评论


答:

0赞 Pravallika KV 10/26/2023 #1

当 blob 位于 中时,它被设置为 并且不能被读取或修改。因此,无法覆盖存档层中的 Blob。Archive tieroffline

若要覆盖 Blob,必须确保 blob 处于联机状态且未设置为“存档”。

这可以通过两种方式使用补液来实现:

方法1:

  • 将存档的 blob 复制到位于 using .Hot or Cool tier the Copy Blob operation
  • 将存档的 blob 复制到联机层中的新 blob 时,源 blob 在存档层中保持不变。
  • 将 blob 复制到联机层后,可以根据需要覆盖它。

方法2:

  • 使用操作将 Blob 的层从 更改为 。archivehot or coolSet Blob Tier

我在存档层中有一个 Blob:I have a Blob in Archive tier:

enter image description here

  • 为了解除冻结存档层 Blob,我使用了@VenkatesanSO 中获取的以下代码片段
String sourceConnectionString = "<Source_storage_Connection_string>";
        String destConnectionString = "<destination_storage_connection_string>";
        String sourceContainerName = "<source_container_name>";//demo
        String destContainerName = "<destination_container_name>";//demo
        String sourceBlobName = "<your_source_blob_name>";//demoblob/Blob.txt
        String destBlobName = "<destination>";//demo.txt
        
        BlobClient sourceBlobClient = new BlobServiceClientBuilder().connectionString(sourceConnectionString)
                .buildClient().getBlobContainerClient(sourceContainerName).getBlobClient(sourceBlobName);
        BlobClient destBlobClient = new BlobServiceClientBuilder().connectionString(destConnectionString)
                .buildClient().getBlobContainerClient(destContainerName).getBlobClient(destBlobName);
        
        // Generating SAS token
        OffsetDateTime sasExpiry = OffsetDateTime.now().plusMinutes(1);
        BlobSasPermission permission = new BlobSasPermission().setReadPermission(true);
        BlobServiceSasSignatureValues sas = new BlobServiceSasSignatureValues(sasExpiry, permission);
        String sourceURL = sourceBlobClient.getBlobUrl() + "?" + sourceBlobClient.generateSas(sas);
        

        Map<String, String> metadata = new HashMap<>();
        metadata.put("key", "value");
        
        // Performing blob copy with rehydration
        destBlobClient.beginCopy(sourceURL, metadata, AccessTier.COOL, RehydratePriority.HIGH, null, null, null);
        
        System.out.println("Blob copy operation is initiated with rehydration.");

输出:

enter image description here

enter image description here

  • 使用冷层创建的 Blob 的副本:A copy of the Blob created with Cool tier

enter image description here

  • 可以使用冷层覆盖新生成的 Blob。

引用:

存档层中的 Blob 解除冻结 |Microsoft Learn将存档的 Blob 解除冻结到联机层 - Azure 存储 |Microsoft 学习