如何使用 Java/REST 将 Azure blob 从一个存储容器移动到另一个存储容器?

How to move Azure blob from one Storage container to another using Java/ REST?

有人可以帮忙吗?我正在关注 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 技能并不好。

谢谢

如果你想将一个 blob 从一个存储容器复制到另一个存储容器,你可以使用 beginCopy method, firstly get the source blob url with getBlobUrl 方法然后传递它。

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

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

实际上从所有这些方法中 link 你可以发现它们都提供 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);

        }