Чтение 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 сделали свое дело

0 ответов

Другие вопросы по тегам