Как скопировать файл Azure в большой двоичный объект Azure?

У меня есть файлы в хранилище файлов Azure.

Я пытаюсь программно архивировать их в большие двоичные объекты Azure и не знаю, как это сделать эффективно.

Я продолжаю видеть образцы кода о копировании из одного контейнера больших двоичных объектов в другой контейнер больших двоичных объектов .. но не из файла в большой двоичный объект.

Можно ли обойтись без загрузки всего содержимого файла локально, а затем без загрузки этого содержимого? Может быть, использовать Ури или что-то в этом роде?

Больше информации:

  1. Контейнеры File и Blob находятся в одной учетной записи хранения.
  2. Учетная запись хранения RA-GRS

Вот пример кода, над которым я думал ... но он просто не кажется правильным :( (также псевдокод ... без проверки и проверки).

var file = await ShareRootDirectory.GetFileReference(fileName);
using (var stream = new MemoryStream())
{
    await file.DownloadToStreamAsync(stream);

    // Custom method that basically does:
    // 1. GetBlockBlobReference
    // 2. UploadFromStreamAsync
    await cloudBlob.AddItemAsync("some-container", stream);
}

person Pure.Krome    schedule 13.03.2017    source источник
comment
Если это полезно, помогите пометить его как ответ, который поможет большему количеству сообществ, у которых есть такая же проблема.   -  person Tom Sun - MSFT    schedule 15.03.2017
comment
и @ TomSun-MSFT .. То же самое и с вопросом :) Если полезно, проголосуйте за :)   -  person Pure.Krome    schedule 16.03.2017


Ответы (2)


Как скопировать файл Azure в большой двоичный объект Azure?

Мы также можем использовать CloudBlockBlob.StartCopy (CloudFile). CloudFile тип также может быть принят функцией CloudBlockBlob.StartCopy. Как скопировать CloudFile в большой двоичный объект, см. документ. Следующий демонстрационный код - это отрывок из документа.

// Parse the connection string for the storage account.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
    Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));

// Create a CloudFileClient object for credentialed access to File storage.
CloudFileClient fileClient = storageAccount.CreateCloudFileClient();

// Create a new file share, if it does not already exist.
CloudFileShare share = fileClient.GetShareReference("sample-share");
share.CreateIfNotExists();

// Create a new file in the root directory.
CloudFile sourceFile = share.GetRootDirectoryReference().GetFileReference("sample-file.txt");
sourceFile.UploadText("A sample file in the root directory.");

// Get a reference to the blob to which the file will be copied.
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("sample-container");
container.CreateIfNotExists();
CloudBlockBlob destBlob = container.GetBlockBlobReference("sample-blob.txt");

// Create a SAS for the file that's valid for 24 hours.
// Note that when you are copying a file to a blob, or a blob to a file, you must use a SAS
// to authenticate access to the source object, even if you are copying within the same
// storage account.
string fileSas = sourceFile.GetSharedAccessSignature(new SharedAccessFilePolicy()
{
    // Only read permissions are required for the source file.
    Permissions = SharedAccessFilePermissions.Read,
    SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24)
});

// Construct the URI to the source file, including the SAS token.
Uri fileSasUri = new Uri(sourceFile.StorageUri.PrimaryUri.ToString() + fileSas);

// Copy the file to the blob.
destBlob.StartCopy(fileSasUri);

Примечание:

Если вы копируете большой двоичный объект в файл или файл в большой двоичный объект, необходимо использовать подпись общего доступа (SAS) для аутентификации исходного объекта, даже если вы копируете в той же учетной записи хранения .

person Tom Sun - MSFT    schedule 13.03.2017
comment
Приведенный выше код не будет работать как есть. Для этого файла потребуется создать SAS URI и использовать его в StartCopy (). Пожалуйста, обновите свой ответ соответствующим образом. - person Gaurav Mantri; 13.03.2017
comment
Ты прав. Я обновил ответ. Спасибо. - person Tom Sun - MSFT; 13.03.2017

Используйте диспетчер передачи: https://msdn.microsoft.com/en-us/library/azure/microsoft.windowsazure.storage.datamovement.transfermanager_methods.aspx

Есть способы скопировать из CloudFile в CloudBlob.

Добавьте пакет nuget "Microsoft.Azure.Storage.DataMovement"

using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.File;
using Microsoft.WindowsAzure.Storage.DataMovement;

private string _storageConnectionString = "your_connection_string_here";

public async Task CopyFileToBlob(string blobContainer, string blobPath, string fileShare, string fileName)
{
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(_connectionString);
    CloudFileShare cloudFileShare = storageAccount.CreateCloudFileClient().GetShareReference(fileShare);
    CloudFile source = cloudFileShare.GetRootDirectoryReference().GetFileReference(fileName);

    CloudBlobContainer blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference(blobContainer);
    CloudBlockBlob target = blobContainer.GetBlockBlobReference(blobPath);

    await TransferManager.CopyAsync(source, target, true);
}
person Zachary Schroeder    schedule 16.08.2017