Для осуществления безопасной загрузки файлов мой клиент Angular запрашивает одноразовый токен, а затем браузер связывает эту конечную точку с токеном, чтобы инициировать загрузку из Asp.Net Web Api.Затем сервер извлекает объект из amazon, я копирую их поток ответов в MemoryStream следующим образом:
using (var client = new AmazonS3Client())
{
var request = new GetObjectRequest
{
BucketName = bucket,
Key = key
};
using (var response = await client.GetObjectAsync(request))
using (var responseStream = response.ResponseStream)
{
streamResponse.ContentLength = response.ContentLength;
await responseStream.CopyToAsync(streamResponse.Stream);
streamResponse.Stream.Position = 0;
return streamResponse;
}
}
Как только этот объект-оболочка (streamResponse) возвращается в контроллер, я возвращаю новый HttpResponse сКонтент, настроенный на новый StreamContent, получающий MemoryStream из предыдущего метода:
var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StreamContent(_objectFromStorageResponse.StreamResponse.Stream)
};
httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = _objectFromStorageResponse.FileNm
};
httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
httpResponseMessage.Content.Headers.ContentLength = _objectFromStorageResponse.StreamResponse.ContentLength;
return httpResponseMessage;
Теперь это на самом деле прекрасно работает в том, что касается загрузки пользовательского интерфейса -> Api.Файл потоков в браузер просто отлично.
Однако при работе с большими файлами (> 250 МБ) часть потока копирования становится очень медленной. Таким образом, пользовательский интерфейс должен немного зависать, создавая плохой пользовательский интерфейс, поскольку они ожидаютих загрузка даже началась.Очевидно, я мог бы облегчить проблему пользовательского интерфейса с отображением сообщения или счетчика, позволяющего пользователю знать, что мы обрабатываем загрузку.Но я не могу не думать, что есть лучший способ начать процесс загрузки раньше для конечного пользователя.Я попытался вернуть поток напрямую, а не копировать поток в свой собственный поток, но я думаю, что контроллер все равно сам это делает, потому что кажется, что опыт тот же.
Это единственный способ для меня использовать потоковые объекты S3 из моего веб-API?Есть ли другой способ сделать это?Или это просто так, и мне нужно показать какой-то отзыв пользователю?