在开始发送之前,HttpResponse.Filter会缓冲整个数据吗?

时间:2010-04-06 10:45:46

标签: c# .net asp.net compression httpresponse

用户发布了有关how to use HttpResponse.Filter to compress large amounts of data的文章。但是如果我尝试转移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 个答案:

答案 0 :(得分:2)

HttpResponse.Filter是一个流:你可以用块写入它。

你正确地做到了。您正在使用FileStream和DeflateStream从文件中读取并压缩它。您正在读取4096个字节,然后将它们写入响应流。所以你所使用的只是4096字节(以及更多)的内存。