Чтение PushStreamContent - ASP.NET MVC/jQuery
Контекст: мне нужно обработать данные изображения клиента. Количество изображений составляет около 2 КБ для каждого продукта, который они имеют. Технический стек - это jQuery, ASP.NET MVC 5, Web Api 2. Мы храним изображения в S3. Мы размещаем веб-сайт, который также позволяет клиенту загружать все изображения продукта. Данные изображений будут храниться в сотнях МБ, поэтому я считаю, что их буферизация перед отправкой клиенту может оказаться не самой лучшей идеей. Из статьи Стивена Клири - https://blog.stephencleary.com/2016/10/async-pushstreamcontent.html, я могу реализовать ее и могу начать загрузку в веб-браузере. Однако я не могу придумать способ прочитать поток и начать загрузку / сохранение файла - либо непосредственно через MVC, либо через сам jQuery.
Я новичок в этом и буду признателен за любую помощь. Фрагмент кода для добавления содержимого в поток ответов
[HttpGet]
[Route("")]
public async Task<HttpResponseMessage> Zip()
{
string prefix = string.Concat("XXXX", "/", "XXXX");
var s3Objects = _s3Client.ListObjects("XXXXXXX", prefix, "/");
var content = new PushStreamContent(async (outputStream, httpContext, transportContext) =>
{
using (var zipStream = new ZipOutputStream(outputStream))
{
foreach (var entry in s3Objects)
{
if (entry.Size > 0)
{
zipStream.PutNextEntry(entry.Key);
try
{
using (var stream = await GetImageAsync("xxx", entry.Key)) //custom implementation to read S3 files
{ await stream.CopyToAsync(zipStream); }
}
catch (Exception e)
{ //log error or whatever}
}
}
}
});
var response = new HttpResponseMessage
{
Content = content
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "xxxx.zip" };
return response;
}
Обновление 1: я мог прочитать его в Response.OutputStream в MVC, однако приложение считывает весь контент, прежде чем загрузить его в браузер. Я ищу способ начать загрузку данных в браузере, не блокируя их. Вот фрагмент кода
public async Task Index()
{
var url = "http://localhost/api/v1/images";
using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
{
Response.ContentType = "application/octet-stream";
Response.AddHeader("content-disposition", "filename=Test.zip");
await streamToReadFrom.CopyToAsync(Response.OutputStream);
}
}
}
Обновление 2: настройка Response.Bufferoutput = false сделали свое дело