Будет ли HttpResponse.Filter буферизовать все данные перед началом отправки? - PullRequest
0 голосов
/ 06 апреля 2010

Пользователь публикует эту статью о , как использовать HttpResponse.Filter для сжатия больших объемов данных .Но что произойдет, если я попытаюсь передать файл 4G?загрузит ли он весь файл в память, чтобы сжать его?или иначе он будет сжимать его по частям?

Я имею в виду, я делаю это прямо сейчас:

        public void GetFile(HttpResponse response)
    {
        String fileName = "example.iso";
        response.ClearHeaders();
        response.ClearContent();
        response.ContentType = "application/octet-stream";
        response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
        response.AppendHeader("Content-Length", new FileInfo(fileName).Length.ToString());
        using (FileStream fs = new FileStream(Path.Combine(HttpContext.Current.Server.MapPath("~/App_Data"), fileName), FileMode.Open))
        using (DeflateStream ds = new DeflateStream(fs,CompressionMode.Compress))
        {
            Byte[] buffer = new Byte[4096];
            Int32 readed = 0;

            while ((readed = ds.Read(buffer, 0, buffer.Length)) > 0)
            {
                response.OutputStream.Write(buffer, 0, readed);
                response.Flush();
            }
        }
    }

Так что в то же время я читаю, я сжимаюи отправив его.Тогда я хочу знать, если HttpResponse.Filter сделает то же самое, или иначе он загрузит весь файл в память, чтобы сжать его.

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

Приветствия.

1 Ответ

2 голосов
/ 06 апреля 2010

HttpResponse.Filter - это поток: вы можете писать в нем кусками.

Вы делаете это правильно.Вы используете FileStream и DeflateStream для чтения из файла и сжатия его.Вы читаете 4096 байт за раз, а затем записываете их в поток ответов.Таким образом, все, что вы используете, это 4096 байт (и немного больше) памяти.

...