Копирование файла на сервер 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 мб:
Сперва я подумал что проблема в 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.
