Копирование файла на сервер Blazor

Всем привет.

Я хотел реализовать сохранение файла на сервере. По теме нашёл это видео: https://www.youtube.com/watch?v=ZKzl2THT5zg и в принципе всё получилось. Но есть одно весомое "но": при такой реализации требуется очень много оперативной памяти. Вот предложенный автором метод сохранения файла:

public async Task upload(IFileListEntry file)
    {
        var memoryStream = new MemoryStream())
        var path = Path.Combine(webHostEnvironment.ContentRootPath, "UploadedFiles", DateTime.Today.ToString("dd_MM_yyyy") + "_" + file.Name);


        await file.Data.CopyToAsync(memoryStream);

        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write)) {
            memoryStream.WriteTo(fileStream);
        }
    }

Вот что происходит если вкинуть файл на 80 мб:

Вот что происходит если вкинуть файл на 80 мб

Сперва я подумал что проблема в memoryStream:

1)

// пробовал использовать memoryStream внутри usnig, чтобы освобождать после использования всю память 
// им занятую
        using (var memoryStream = new MemoryStream()){
            var path = Path.Combine(webHostEnvironment.ContentRootPath, "UploadedFiles", DateTime.Today.ToString("dd_MM_yyyy") + "_" + file.Name);

            await file.Data.CopyToAsync(memoryStream);

            using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write)) {
                memoryStream.WriteTo(fileStream);
            }
        }
// пробовал очищать memoryStream после
        var memoryStream = new MemoryStream();
        var path = Path.Combine(webHostEnvironment.ContentRootPath, "UploadedFiles", DateTime.Today.ToString("dd_MM_yyyy") + "_" + file.Name);

        await file.Data.CopyToAsync(memoryStream);

        using (FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write)) {
            memoryStream.WriteTo(fileStream);
        }

        memoryStream.Close();
        memoryStream.Dispose();

Результат нулевой. Как забирает память, так не отдаёт обратно. Возможно другой метод копирования на подобии такого дал бы мне лучший результат:

private void copyStream(Stream src, Stream dest)
    {
        int _bufferSize = 1024;
        var buffer = new byte[_bufferSize];
        int len;
        while ((len = src.Read(buffer, 0, buffer.Length)) > 0)
        {
            dest.Write(buffer, 0, len);
        }
    }

Но я не понимаю как мне воспользоваться в данной ситуации таким алгоритмом. Я попросту не могу понять как мне преобразовать IFileListEntry в Stream чтобы его можно было скормить данной функции.

В самом Blazor я использую библиотеку "BlazorInputFile".

Помогите пожалуйста либо применить копирование с использованием буфера, либо скажите в чём проблема в методе upload.


Ответы (0 шт):