当前位置:  开发笔记 > 后端 > 正文

使用SharpZipLib通过.net中的http流式传输zip文件

如何解决《使用SharpZipLib通过.net中的http流式传输zip文件》经验,为你挑选了1个好方法。

我正在制作一个简单的下载服务,以便用户可以从外部网站下载他的所有图像.要做到这一点,我只需将所有内容压缩到http流.

然而,似乎一切都存储在内存中,并且直到zip文件完成并且输出关闭才发送数据.我希望服务立即开始发送,而不是使用太多内存.

public void ProcessRequest(HttpContext context)
{
    List fileNames = GetFileNames();
    context.Response.ContentType = "application/x-zip-compressed";
    context.Response.AppendHeader("content-disposition", "attachment; filename=files.zip");
    context.Response.ContentEncoding = Encoding.Default;
    context.Response.Charset = "";

    byte[] buffer = new byte[1024 * 8];

    using (ICSharpCode.SharpZipLib.Zip.ZipOutputStream zipOutput = new ICSharpCode.SharpZipLib.Zip.ZipOutputStream(context.Response.OutputStream))
    {
        foreach (string fileName in fileNames)
        {
            ICSharpCode.SharpZipLib.Zip.ZipEntry zipEntry = new ICSharpCode.SharpZipLib.Zip.ZipEntry(fileName);
            zipOutput.PutNextEntry(zipEntry);
            using (var fread = System.IO.File.OpenRead(fileName))
            {
                ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(fread, zipOutput, buffer);
            }
        }
        zipOutput.Finish();
    }

    context.Response.Flush();
    context.Response.End();
}

我可以看到工作进程内存在生成文件时增长,然后在完成发送时释放内存.如何在不使用太多内存的情况下执行此操作?



1> Jon Skeet..:

禁用响应缓冲,context.Response.BufferOutput = false;Flush从代码末尾删除调用.

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有