Загрузка и скачивание файлов gRPC и Blazor WASM

Миссия скинуть каким либо способом файлы 1-150мб (в среднем) на сервер.

После чего смочь его оттуда скачать.

После гугла стало понятно, что надо делать через api, на бэке gRPC с этим проблем вроде нет.

Собственно код который загружает файл:

    private async void UploadFiles(InputFileChangeEventArgs e)
    {
        foreach (var file in e.GetMultipleFiles())
        {
            using (var ms = file.OpenReadStream(file.Size))
            {
                var result  = new StreamContent(ms, Convert.ToInt32(file.Size));
                var bytes  = await result.ReadAsByteArrayAsync();
                using var serverStream = GreeterClient.DownloadFileAsync(new FileRequest  { FileName = file.Name, FileBytes = Google.Protobuf.ByteString.CopyFrom(bytes)});
                var stream = await serverStream.ResponseAsync;
                var resultStatus = stream.Status;
            }
        }
    }

Но проблема в том, что файл 130мб, при выполнении

await result.ReadAsByteArrayAsync()

Сжирает ~1.4 гига оперативы, что не выглядит нормальным.

Как это исправить? Возможно это сам по себе ужасный способ, но другого я не придумал. И вопрос про скачивание, это возможно сделать без JS?

Дополню файлом proto

service Greeter {
  rpc DownloadFile(FileRequest) returns (StatusRequest);
}

message FileRequest {
    string FileName = 1;
    bytes FileBytes =2;
}

message StatusRequest {
string Status = 1;
}

Если делать так

int max = 1024 * 1024; 
                using (var bufferedFileStream =
                new BufferedStream(item.OpenReadStream(item.Size), max)) 
                {
                    byte[] buffer = new byte[1024];
                    while ((await bufferedFileStream.ReadAsync(buffer, 0, buffer.Length)) > 0)
                    {

                    };
                }

то съедает оперативы примерно столько же, сколько весит файл.


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