0

ユーザーは、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が同じことを行うかどうかを知りたいです。そうでない場合は、ファイル全体をメモリにロードして圧縮します。

また、私はこれについて少し不安です...多分それを圧縮するためにメモリにファイル全体をロードするために必要です...そうですか?

乾杯。

4

1 に答える 1

2

HttpResponse.Filterはストリームです:チャンクで書き込むことができます。

あなたはそれを正しくやっています。FileStreamとDeflateStreamを使用して、ファイルから読み取り、圧縮します。一度に4096バイトを読み取り、それを応答ストリームに書き込んでいます。したがって、使用しているのは4096バイト(およびもう少し)のメモリだけです。

于 2010-04-06T10:49:19.570 に答える