Загрузите большой двоичный объект, используя Azure клиентскую библиотеку хранилища BLOB-объектов v12 для. NET - PullRequest
0 голосов
/ 07 мая 2020

Я использую Azure .Storage.Blobs version = 12.4.1. У меня есть конечная точка REST, которую я хочу использовать для загрузки больших двоичных объектов из учетной записи хранения.

Мне нужно передать результат в HttpResponseMessage , и я не хочу использовать MemoryStream. Я хочу передать результат прямо вызывающему клиенту. Есть ли способ этого добиться. Как получить загруженный BLOB-объект в содержимом HttpResponseMessage? Я не хочу использовать MemoryStream, так как будет много запросов на загрузку.

Класс BlobClient имеет метод DownloadToAsyn c, но для него требуется Stream в качестве параметра.

        var result = new HttpResponseMessage(HttpStatusCode.OK);

        var blobClient = container.GetBlobClient(blobPath);
        if (await blobClient.ExistsAsync())
        {
            var blobProperties = await blobClient.GetPropertiesAsync();

            var fileFromStorage = new BlobResponse()
            {                    
                ContentType = blobProperties.Value.ContentType,
                ContentMd5 = blobProperties.Value.ContentHash.ToString(),
                Status = Status.Ok,
                StatusText = "File retrieved from blob"
            };

            await blobClient.DownloadToAsync(/*what to put here*/);
            return fileFromStorage;
        }

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Вы можете просто создать новый поток памяти и загрузить содержимое большого двоичного объекта в этот поток.

Что-то вроде:

        var connectionString = "UseDevelopmentStorage=true";
        var blobClient = new BlockBlobClient(connectionString, "test", "test.txt");
        var ms = new MemoryStream();
        await blobClient.DownloadToAsync(ms);

ms будет иметь содержимое большого двоичного объекта. Не забудьте сбросить позицию потока памяти на 0 перед его использованием.

0 голосов
/ 31 июля 2020

Вам нужно использовать

 BlobDownloadInfo download = await blobClient.DownloadAsync();

download.Content is blob Stream. Вы можете использовать его для копирования напрямую в другой поток.

using (var fileStream = File.OpenWrite(@"C:\data\blob.bin"))
{
    await download.CopyToAsync(fileStream);
}
0 голосов
/ 07 мая 2020

Попробуйте использовать приведенный ниже код для загрузки большого двоичного объекта в HttpResponseMessage.

try
{
    var storageAccount = CloudStorageAccount.Parse("{connection string}");
    var blobClient = storageAccount.CreateCloudBlobClient();
    var Blob = await blobClient.GetBlobReferenceFromServerAsync(new Uri("https://{storageaccount}.blob.core.windows.net/{mycontainer}/{blobname.txt}"));
    var isExist = await Blob.ExistsAsync();
    if (!isExist) {
        return Request.CreateErrorResponse(HttpStatusCode.NotFound, "file not found");
    }
    HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.OK);
    Stream blobStream = await Blob.OpenReadAsync();
    message.Content = new StreamContent(blobStream);
    message.Content.Headers.ContentLength = Blob.Properties.Length;
    message.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(Blob.Properties.ContentType);
    message.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
    {
        FileName = "{blobname.txt}",
        Size = Blob.Properties.Length
    };
    return message;
}
catch (Exception ex)
{
    return new HttpResponseMessage
    {
        StatusCode = HttpStatusCode.InternalServerError,
        Content = new StringContent(ex.Message)
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...