簡體   English   中英

如何使用 Azure 客戶端庫 v12 將整個容器從一個 Azure Blob 服務復制到另一個

[英]How to copy whole Container from one Azure Blob Service to another with Azure Client Library v12

我正在嘗試編程 Azure 工具,特別是嘗試將容器從一個 Azure Blob 存儲帳戶復制/克隆/移動到另一個帳戶。 盡管在其文檔中使用客戶端庫的 v12.x(至少到目前為止),但我沒有看到這樣做的好方法。

例如:

BlobStorage1
|-- SomeContrainer
    |-- blob1
    |-- blob2
    |-- blob3

BlobStorage2
|-- SomeOtherContrainer
    |-- otherBlob

我想以編程方式將 SomeContainer 及其所有 blob 移動到 BlobStorage2。

到目前為止我已經嘗試過:

文檔閱讀/咨詢:

這似乎沒有顯示如何將 go 從 account1送到 account2。 您可以從 account2 下拉到 account one,但這與我所追求的相反。

代碼嘗試:

var localContainer = blobServiceClient.GetBlobContainerClient(localContainerName);
var blobs = localContainer.GetBlobs();

var remoteClient = new BlobServiceClient(remoteConnectionString);
var remoteContainer = remoteClient.GetBlobContainerClient(localContainerName);

foreach(var blob in blobs)
{
    Console.WriteLine($"copying blob: {blob.Name}");
    var sourceBlob = localContainer.GetBlobClient(blob.Name);
    var remoteBlobClient = remoteContainer.GetBlobClient(blob.Name);
    await remoteBlobClient.StartCopyFromUriAsync(sourceBlob.Uri);
}

這里的問題是我可以從遠程復制到本地(通過連接字符串),或者在同一個帳戶中復制,因為 URI 非常相似,但不能從我使用的帳戶復制到單獨的存儲帳戶。 使用客戶端庫 (v12.x) 從一個帳戶復制 blob(或容器整體銷售,如果可能)的推薦方法是什么?

請嘗試以下代碼:

    static async Task CopyContainersAcrossAccounts()
    {
        var sourceAccountName = "source-account";
        var sourceAccountKey = "source-account-key";
        var targetAccountName = "target-account";
        var targetAccountKey = "target-account-key";
        Azure.Storage.StorageSharedKeyCredential sourceCredential = new Azure.Storage.StorageSharedKeyCredential(sourceAccountName, sourceAccountKey);
        Azure.Storage.StorageSharedKeyCredential targetCredential = new Azure.Storage.StorageSharedKeyCredential(targetAccountName, targetAccountKey);
        var sourceConnectionString = $"DefaultEndpointsProtocol=https;AccountName={sourceAccountName};AccountKey={sourceAccountKey};EndpointSuffix=core.windows.net;";
        var sourceContainer = "source-container-name";
        var targetConnectionString = $"DefaultEndpointsProtocol=https;AccountName={targetAccountName};AccountKey={targetAccountKey};EndpointSuffix=core.windows.net;";
        var targetContainer = "target-container-name";
        var sourceBlobContainerClient = new Azure.Storage.Blobs.BlobContainerClient(sourceConnectionString, sourceContainer);
        
        var targetBlobContainerClient = new Azure.Storage.Blobs.BlobContainerClient(targetConnectionString, targetContainer);
        var sourceBlobs = sourceBlobContainerClient.GetBlobs();
        foreach (var blob in sourceBlobs)
        {
            //Get shared access signature with "Read" permission in case source container is a private container.
            Azure.Storage.Sas.BlobSasBuilder blobSasBuilder = new Azure.Storage.Sas.BlobSasBuilder()
            {
                BlobContainerName = sourceContainer,
                BlobName = blob.Name,
                ExpiresOn = DateTime.UtcNow.AddHours(1)
            };
            blobSasBuilder.SetPermissions(Azure.Storage.Sas.BlobSasPermissions.Read);
            var sasToken = blobSasBuilder.ToSasQueryParameters(sourceCredential).ToString();
            var sourceBlobClient = sourceBlobContainerClient.GetBlobClient(blob.Name);
            var targetBlobClient = targetBlobContainerClient.GetBlobClient(blob.Name);
            var sourceBlobUri = new Uri($"{sourceBlobClient.Uri.AbsoluteUri}?{sasToken}");
            await targetBlobClient.StartCopyFromUriAsync(sourceBlobUri);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM