Я знаю о загрузке кусками, нужно ли что-то делать по окончании?

Моя функция Azure получает большие видеофайлы и изображения и сохраняет их в BLOB-объекте Azure. Клиентский API отправляет данные порциями в мою триггерную функцию Azure htttp. Нужно ли что-то делать на приемном конце, чтобы повысить производительность, например, получать данные порциями?

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

foreach (HttpContent ctnt in provider.Contents)  {

                var dataStream = await ctnt.ReadAsStreamAsync();
 if (ctnt.Headers.ContentDisposition.Name.Trim().Replace("\"", "") == "file")
               {                
                        byte[] ImageBytes = ReadFully(dataStream);
                        var fileName = WebUtility.UrlDecode(ctnt.Headers.ContentDisposition.FileName);                         

              } }

Функция ReadFully

 public static byte[] ReadFully(Stream input){
using (MemoryStream ms = new MemoryStream())
{
    input.CopyTo(ms);
    return ms.ToArray();
}}

1 ответ

Решение

Как BlobRequestOptions.ParallelOperationThread гласит следующее:

Получает или задает количество блоков, которые могут быть одновременно загружены.

Примечания:

При использовании методов UploadFrom * для большого двоичного объекта большой двоичный объект будет разбит на блоки. Установка этого значения ограничивает число невыполненных запросов ввода-вывода "положить блок", которые библиотека будет выполнять в данный момент. По умолчанию 1 (без параллелизма). Установка этого значения выше может привести к более быстрой загрузке BLOB-объектов в зависимости от сети между клиентом и службой хранилища Azure. Если большие двоичные объекты (менее 256 МБ), рекомендуется оставить это значение равным 1.

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

var requestOption = new BlobRequestOptions()
{
    ParallelOperationThreadCount = 5 //Gets or sets the number of blocks that may be simultaneously uploaded.
};

//upload a blob from the local file system
await blockBlob.UploadFromFileAsync("{your-file-path}",null,requestOption,null);

//upload a blob from the stream
await blockBlob.UploadFromStreamAsync({stream-for-upload},null,requestOption,null);

foreach (HttpContent ctnt в provider.Contents)

Исходя из вашего кода, я предположил, что вы получите provider пример следующим образом:

MultipartMemoryStreamProvider provider = await request.Content.ReadAsMultipartAsync();

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

var blobname = ctnt.Headers.ContentDisposition.FileName.Trim('"');
CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobname);
//set the content-type for the current blob
blockBlob.Properties.ContentType = ctnt.Headers.ContentType.MediaType;
await blockBlob.UploadFromStreamAsync(await ctnt.Content.ReadAsStreamAsync(), null,requestOption,null);

Я бы предпочел использовать MultipartFormDataStreamProvider, который будет хранить загруженные файлы с клиента в файловую систему вместо MultipartMemoryStreamProvider который будет использовать память сервера для временного хранения данных, отправленных с клиента. Для подхода MultipartFormDataStreamProvider вы могли бы следовать этой аналогичной проблеме. Более того, я бы предпочел использовать клиентскую библиотеку хранилища Azure с моей функцией Azure. Вы можете выполнить " Начало работы с хранилищем BLOB-объектов Azure, используя.NET".

ОБНОВИТЬ:

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

Другие вопросы по тегам