Я знаю о загрузке кусками, нужно ли что-то делать по окончании?
Моя функция 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".
ОБНОВИТЬ:
Более того, вы могли бы следовать этому руководству по разбивке больших файлов на маленькие куски, загружать их на стороне клиента, а затем объединять их на стороне сервера.