Копировать файл из одной учетной записи хранения Azure в другую - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь скопировать файл из одной учетной записи хранения в другую, используя метод 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) Not Found. '

Что мне здесь не хватает?

Обратите внимание, тот же код работает отлично, если я пытаюсь копировать файлы из одного контейнера в другой в той же учетной записи хранения .

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Вот еще один способ сделать это, используя 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.Чтобы получить ссылку, установите Microsoft.Azure.Storage.DataMovement в диспетчере nuget.

0 голосов
/ 08 февраля 2019

Я недавно столкнулся с этой ошибкой, пытаясь скопировать из / uploads в / raw внутри одной учетной записи BLOB-объекта.

Проблема заключалась в том, что контейнер / raw не существовал на стороне назначения в тестовой среде.

(т. Е. Эта ошибка фактически выдается адресатом, а не источником)

0 голосов
/ 15 ноября 2018

Взгляните на следующий пример того, как должна выполняться копия (взято из Представление асинхронного большого количества копий с одного счета ):

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));
    }
}

Надеюсь, это поможет!

...