Слишком много загрузок? - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь загрузить большой видеофайл.Я использую хранилище Azure Storage.При чтении документации есть предупреждение об использовании IFormFile на https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-2.1. Это говорит о том, что я передаю свои данные.Следующий код, создающий там буфер, приведет к сбою моего сервера или к потоковой передаче непосредственно в хранилище?

Из представления

 <form asp-action="Create" enctype="multipart/form-data">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Name" class="control-label"></label>
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Description" class="control-label"></label>
                <input asp-for="Description" class="form-control" />
                <span asp-validation-for="Description" class="text-danger"></span>
            </div>
            <div class="form-group">                
                <input asp-for="VideoAsFile" class="form-control" />
                <span asp-validation-for="VideoAsFile" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </form>

С контроллера

 public async Task<IActionResult> Create([Bind(" Name,Description,VideoAsFile")] VideoWithFileViewModel video)
        {
            if (ModelState.IsValid)
            {
                string imageId;
                using (var stream = video.VideoAsFile.OpenReadStream())
                {
                    imageId = videoServices.SaveVideo(stream);

                }
                var newVideo = new Video()
                {
                    Name = video.Name,
                    Description = video.Description,
                    URL = imageId

                };

               repository.AddVideo(newVideo, User);
                repository.SaveAll();
                return RedirectToAction(nameof(Index));
            }

Из Видеоуслуг

public string SaveVideo(Stream videoStream)
        {
           CloudBlobClient blobClient=new CloudBlobClient(new Uri(baseUri), credentials);
            var imageId = Guid.NewGuid().ToString();
            var container = blobClient.GetContainerReference("videos");
            var blob = container.GetBlockBlobReference(imageId);
            blob.UploadFromStreamAsync(videoStream);
            return imageId;
        }

1 Ответ

1 голос
/ 25 марта 2019

IFormFile вызывает проблемы, потому что механизм связывания модели может делать свое дело только после того, как тело запроса будет полностью помещено в память, что, если у вас большая загрузка, может означать использование большого количества гигабайт ОЗУ или потенциальное увеличение объема ОЗУ.полное использование.

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

Поток тела запроса будет закодирован как multipart/form-data, поэтому вам придется вручную разобрать его на составные части и связатьданные непосредственно в вашу сущность / модель, а затем считайте часть файла буферизованным способом, передавая блоки, которые вы читаете, в хранилище BLOB-объектов Azure по частям.У Microsoft есть пример выполнения буферизованной загрузки .Тем не менее, он записывает файл загрузки на диск.Загрузка его в хранилище BLOB-объектов Azure *. 1011 *

...