【问题标题】:How to move Azure blob from one Storage container to another using Java/ REST?如何使用 Java/REST 将 Azure blob 从一个存储容器移动到另一个容器?
【发布时间】:2020-07-21 19:57:40
【问题描述】:

有人可以帮忙吗?我正在关注 Java JDK 示例,有很多关于如何管理容器和 blob 的示例,但是没有说明如何从一个存储容器移动到另一个存储容器。

例如,我在 StorageOne/ContainerOne/BlobName 上有一个 blob 需要移动到 Storage2/ContainerTwo/BlobName

我正在看这个网站https://github.com/Azure/azure-sdk-for-java/blob/master/sdk/storage/azure-storage-blob/README.md 无论如何运气不好。

我还设法通过 ConnectionString 连接并创建、下载 blob,但不知道如何移动。

任何建议都会有所帮助。我也尝试在 Azure 中创建一个 App Function 来做,但我的 powershell 技能并不好。

谢谢

【问题讨论】:

  • 现在有任何进程吗?

标签: java azure powershell blob


【解决方案1】:

如果你想将一个blob从一个存储容器复制到另一个存储容器,你可以使用beginCopy方法,首先用getBlobUrl方法获取源blob url然后传递它。

如果你想要一个示例,你可以参考这个 github 示例:BlobAsyncClientBaseJavaDocCodeSnippets

如果你想将一个blob从源容器移动到另一个容器并且它在源容器中不存在,目前没有直接的方法可以实现,你可以先复制blob,复制活动后删除源带有delete 方法的blob。

实际上,从所有这些方法链接中,您可以发现它们都提供了 github 示例,只需遵循项目结构即可。

更新:如果你想要一个示例代码,你可以参考我下面的代码,我已经测试它可以工作了。

        String connectStr = "storage account connection string";

        // Create a BlobServiceClient object which will be used to create a container client
        BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(connectStr).buildClient();

        BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient("test");

        BlobContainerClient destcontainer=blobServiceClient.getBlobContainerClient("testcontainer");

        PagedIterable<BlobItem> blobs= containerClient.listBlobs();
        for (BlobItem blobItem : blobs) {

            System.out.println("This is the blob name: " + blobItem.getName());
            BlobClient blobClient=containerClient.getBlobClient(blobItem.getName());
BlobServiceSasSignatureValues sas = new BlobServiceSasSignatureValues(OffsetDateTime.now().plusHours(1),
                BlobContainerSasPermission.parse("r"));
        String sasToken = blobClient.generateSas(sas);

            BlobClient destblobclient=destcontainer.getBlobClient(blobItem.getName());
            destblobclient.beginCopy(blobClient.getBlobUrl()+ "?" + sasToken,null);

        }

更新

        String connectStr = "source storage account connection string";

        String destconnectStr="destination storage account connection string";



        // Create a BlobServiceClient object which will be used to create a container client
        BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(connectStr).buildClient();

        BlobServiceClient destblobServiceClient = new BlobServiceClientBuilder().connectionString(destconnectStr).buildClient();

        BlobContainerClient containerClient = blobServiceClient.getBlobContainerClient("test");

        BlobContainerClient destcontainer=destblobServiceClient.getBlobContainerClient("destcontainer");

        PagedIterable<BlobItem> blobs= containerClient.listBlobs();
        for (BlobItem blobItem : blobs) {

            System.out.println("This is the blob name: " + blobItem.getName());
            BlobClient blobClient=containerClient.getBlobClient(blobItem.getName());
            BlobClient destblobclient=destcontainer.getBlobClient(blobItem.getName());
            destblobclient.beginCopy(blobClient.getBlobUrl(),null);

        }

【讨论】:

  • @Wil Ferraciolli,我已经更新了我的答案,检查一下。
  • 感谢您的帮助,这太棒了,但它只能在同一个存储中工作,当我尝试使用不同的存储帐户时,我收到 404 CannotVerifyCopySource 错误。
  • @Wil Ferraciolli,我用两个存储帐户测试它可以工作。你用过sas令牌吗?也许你可以分享你的代码,我会更新我的工作代码。
  • 如果这对您有帮助,您可以接受它作为答案。谢谢!如果您仍有问题,请随时告诉我。
  • 感谢您的帮助,我现在已经设法让它工作了。我已将 sas 令牌添加到源 Url BlobServiceSasSignatureValues sas = new BlobServiceSasSignatureValues(OffsetDateTime.now().plusHours(1), BlobContainerSasPermission.parse("r"));字符串 sasToken = sourceBlobClient.generateSas(sas);
猜你喜欢
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 2016-11-29
  • 2017-09-10
  • 2020-01-27
  • 2021-10-10
  • 2023-01-31
  • 2020-05-07
相关资源
最近更新 更多