gpt4 book ai didi

asp.net - 如何即时压缩并实时流式传输到 Response.Output?

转载 作者:行者123 更新时间:2023-12-04 03:14:09 25 4
gpt4 key购买 nike

我正在尝试使用以下代码:我得到一个损坏的 zip 文件。为什么?
文件名似乎没问题。也许它们不是相对名称,这就是问题所在?

      private void trySharpZipLib(ArrayList filesToInclude)
{
// Response header
Response.Clear();
Response.ClearHeaders();
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.StatusCode = 200; // http://community.icsharpcode.net/forums/p/6946/20138.aspx
long zipSize = calculateZipSize(filesToInclude);
string contentValue =
string.Format("attachment; filename=moshe.zip;"
); // + " size={0}", zipSize);
Response.ContentType = "application/octet-stream"; //"application/zip";
Response.AddHeader("Content-Disposition", contentValue);
Response.Flush();

using (ZipOutputStream zipOutputStream = new ZipOutputStream(Response.OutputStream) )
{
zipOutputStream.SetLevel(0);

foreach (string f in filesToInclude)
{
string filename = Path.Combine(Server.MapPath("."), f);
using (FileStream fs = File.OpenRead(filename))
{
ZipEntry entry =
new ZipEntry(ZipEntry.CleanName(filename))
{
DateTime = File.GetCreationTime(filename),
CompressionMethod = CompressionMethod.Stored,
Size = fs.Length
};
zipOutputStream.PutNextEntry(entry);

byte[] buffer = new byte[fs.Length];
// write to zipoutStream via buffer.
// The zipoutStream is directly connected to Response.Output (in the constructor)
ICSharpCode.SharpZipLib.Core.StreamUtils.Copy(fs, zipOutputStream, buffer);
Response.Flush(); // for immediate response to user
} // .. using file stream
}// .. each file
}
Response.Flush();
Response.End();
}

最佳答案

男孩,这是很多代码!使用 DotNetZip 你的工作会更简单.假设一个 HTTP 1.1 客户端,这是有效的:

Response.Clear();
Response.BufferOutput = false;
string archiveName= String.Format("archive-{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));
Response.ContentType = "application/zip";
// see http://support.microsoft.com/kb/260519
Response.AddHeader("content-disposition", "attachment; filename=" + archiveName);
using (ZipFile zip = new ZipFile())
{
// filesToInclude is a IEnumerable<String> (String[] or List<String> etc)
zip.AddFiles(filesToInclude, "files");
zip.Save(Response.OutputStream);
}
// Response.End(); // will throw an exception internally.
// Response.Close(); // Results in 'Failed - Network error' in Chrome.
Response.Flush(); // See https://stackoverflow.com/a/736462/481207
// ...more code here...

如果要对 zip 进行密码加密,请在 AddFiles() 之前插入以下行:
    zip.Password = tbPassword.Text; // optional
zip.Encryption = EncryptionAlgorithm.WinZipAes256; // optional

如果您想要一个自解压存档,请将 zip.Save() 替换为 zip.SaveSelfExtractor()。

附录; some people have commented to me DotNetZip 是“不好的”,因为它会在将整个 ZIP 流式传输出来之前在内存中创建整个 ZIP。事实并非如此。当您调用 添加文件 ,该库创建一个条目列表 - 表示要压缩的事物状态的对象。在调用 Save 之前不会进行压缩或加密。如果您为 Save() 调用指定流,则所有压缩字节都会直接流式传输到客户端。

在 SharpZipLib 模型中,可以创建一个条目,然后将其流式传输,然后创建另一个条目,然后将其流式传输,等等。使用 DotNetZip,您的应用程序首先会创建完整的条目列表,然后将它们全部输出。两种方法都不一定比另一种“更快”,尽管对于长文件列表,比如 30,000 个,使用 SharpZipLib 的时间到第一个字节会更快。另一方面,我不建议动态创建包含 30,000 个条目的 zip 文件。

编辑

As of DotNetZip v1.9, DotNetZip supports a ZipOutputStream as well. I still think it's simpler to do things the way I've shown here, though.



有些人的情况是,他们的 zip 内容对于所有用户来说“基本相同”,但每个用户都有几个不同的文件。 DotNetZip 在这方面也很擅长。您可以从文件系统文件中读取 zip 存档,更新一些条目(添加一些,删除一些等),然后保存到 Response.OutputStream。在这种情况下,DotNetZip 不会重新压缩或重新加密您未更改的任何条目。快多了。

当然,DotNetZip 适用于任何 .NET 应用程序,而不仅仅是 ASP.NET。因此,您可以保存到任何流。

如果您想了解更多信息,请查看 site或发布到 dotnetzip forums .

关于asp.net - 如何即时压缩并实时流式传输到 Response.Output?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1074800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com