Загрузка и скачивание файлов 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)
{
};
}
то съедает оперативы примерно столько же, сколько весит файл.