【问题标题】:Copy file from one Azure storage account to another将文件从一个 Azure 存储帐户复制到另一个
【发布时间】:2018-11-15 06:45:30
【问题描述】:

我正在尝试使用StartCopy 方法将文件从一个存储帐户复制到另一个帐户以复制文件。检查下面的代码。

CloudStorageAccount sourceStorageAccount = CloudStorageAccount.Parse(@"source storage account connection string");
CloudStorageAccount destStorageAccount = CloudStorageAccount.Parse(@"destination storage account connection string");

CloudBlobClient sourceBlobClient = sourceStorageAccount.CreateCloudBlobClient();
CloudBlobClient destBlobClient = destStorageAccount.CreateCloudBlobClient();
var sourceContainer = sourceBlobClient.GetContainerReference("sourceContainer");
var destContainer = destBlobClient.GetContainerReference("destContainer");

CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference("copy.txt");
CloudBlockBlob targetBlob = destContainer.GetBlockBlobReference("copy.txt");

targetBlob.StartCopy(sourceBlob);

但它总是返回以下错误。

Microsoft.WindowsAzure.Storage.StorageException: '远程服务器 返回错误:(404)未找到。'

我在这里错过了什么?

注意,如果我尝试将文件从一个容器复制到 same 存储帐户中的另一个容器,则相同的代码可以完美运行。

【问题讨论】:

  • 你可以看看这个link

标签: c# azure azure-storage azure-blob-storage


【解决方案1】:

请看以下示例,了解应如何执行复制(取自Introducing Asynchronous Cross-Account Copy Blob):

public static void CopyBlobs(
            CloudBlobContainer srcContainer,  
            string policyId, 
            CloudBlobContainer destContainer)
{
    // get the SAS token to use for all blobs
    string blobToken = srcContainer.GetSharedAccessSignature(
                   new SharedAccessBlobPolicy(), policyId);


    var srcBlobList = srcContainer.ListBlobs(true, BlobListingDetails.None);
    foreach (var src in srcBlobList)
    {
        var srcBlob = src as CloudBlob;

        // Create appropriate destination blob type to match the source blob
        CloudBlob destBlob;
        if (srcBlob.Properties.BlobType == BlobType.BlockBlob)
        {
            destBlob = destContainer.GetBlockBlobReference(srcBlob.Name);
        }
        else
        {
            destBlob = destContainer.GetPageBlobReference(srcBlob.Name);
        }

        // copy using src blob as SAS
        destBlob.StartCopyFromBlob(new Uri(srcBlob.Uri.AbsoluteUri + blobToken));
    }
}

希望对你有帮助!

【讨论】:

    【解决方案2】:

    这是使用TransferManager.CopyAsync 方法的另一种方法

    CloudStorageAccount sourceStorageAccount = CloudStorageAccount.Parse(@"source storage account connection string");
    CloudStorageAccount destStorageAccount = CloudStorageAccount.Parse(@"destination storage account connection string");
    
    CloudBlobClient sourceBlobClient = sourceStorageAccount.CreateCloudBlobClient();
    CloudBlobClient destBlobClient = destStorageAccount.CreateCloudBlobClient();
    var sourceContainer = sourceBlobClient.GetContainerReference("sourceContainer");
    var destContainer = destBlobClient.GetContainerReference("destContainer");
    
    CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference("copy.txt");
    CloudBlockBlob targetBlob = destContainer.GetBlockBlobReference("copy.txt");
    
    TransferManager.CopyAsync(sourceBlob, targetBlob, true).Wait();
    

    TransferManager 在命名空间Microsoft.WindowsAzure.Storage.DataMovement 下。在 nuget 管理器中获取参考安装 Microsoft.Azure.Storage.DataMovement

    【讨论】:

      【解决方案3】:

      我最近尝试在单个 blob 帐户中从 /uploads 复制到 /raw 时遇到此错误。

      问题在于测试环境中的目标端不存在容器 /raw。

      (即这个错误实际上是由目的地抛出的,而不是源头)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-24
        • 2019-12-30
        • 1970-01-01
        • 1970-01-01
        • 2016-11-25
        • 1970-01-01
        • 2021-08-25
        • 2021-06-27
        相关资源
        最近更新 更多