C#Response.OutputStream损坏下载的文件
我正在尝试创建动态创建的、可下载的ZIP文件。文件是在服务器上正确创建的,但是当使用“Response.OutputStream”将文件发送到客户端时,文件会损坏。这似乎只有在zip文件超过4GB时才会发生。有人知道这是为什么吗 我使用的确切代码是:C#Response.OutputStream损坏下载的文件,c#,asp.net,C#,Asp.net,我正在尝试创建动态创建的、可下载的ZIP文件。文件是在服务器上正确创建的,但是当使用“Response.OutputStream”将文件发送到客户端时,文件会损坏。这似乎只有在zip文件超过4GB时才会发生。有人知道这是为什么吗 我使用的确切代码是: string path = @"C:\temp\vid"; Response.BufferOutput = false; // Disable Buffer Output to start the download
string path = @"C:\temp\vid";
Response.BufferOutput = false; // Disable Buffer Output to start the download immediately
// Set custom headers to force browser to download the file instad of trying to open it
Response.ContentType = "application/x-zip-compressed";
Response.AppendHeader("content-disposition", "attachment; filename=Archive.zip");
ZipOutputStream zipOutputStream = new ZipOutputStream(Response.OutputStream, 20000);
zipOutputStream.SetLevel(0); // No compression
zipOutputStream.UseZip64 = UseZip64.On;//Forces Zip64 to be used
zipOutputStream.IsStreamOwner = true;
try
{
foreach (string file in Directory.GetFiles(path, "*.*", SearchOption.AllDirectories))
{
using (var fs = System.IO.File.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
ZipEntry entry = new ZipEntry(ZipEntry.CleanName(Path.GetFileName(file))); //Create zip compatible name
zipOutputStream.PutNextEntry(entry); //Adds entry to list
fs.CopyTo(zipOutputStream);
zipOutputStream.CloseEntry();
zipOutputStream.Flush();
Response.Flush();
Response.Clear();
}
}
zipOutputStream.Finish();
zipOutputStream.Close();
Response.End();
Response.Flush();
}
catch
{
Debug.WriteLine("Connection Closed or error");
}
return new HttpStatusCodeResult(HttpStatusCode.OK);
首先,通过HTTP发送4GB文件可能不是最好的方法。您使用的是哪个操作系统(特别是哪个文件系统)?或者可能将其分解为多个文件。我不确定为什么在
中使用(…)
块会有响应。Clear()
。一旦完成了刷新
,所有输出都应该被发送(或缓冲以由服务器发送)。下一个问题是,服务器有多少可用RAM?(应用程序,而不是机器。)希望不会有多个客户端试图同时执行此操作。这是像Microsoft.com这样的网站使用下载管理器处理海量文件的原因。使用这种方法,如果有10个人同时下载该文件,您将需要至少40GB的可用RAM(事实上,远不止此)。对于这种大小的文件,这不是一个很好的解决方案。它可能比前面提到的@Dav3更糟糕(或者不是)。我还没有研究ZipOutputStream或Response.outputStream的内部结构,但整个流可能需要在内存中连续分配。需要研究的东西。服务器仍然需要缓冲要发送的数据,并且根据下载速度,它可以很好地在内存中构建绝大多数存档,并且在将其下载到客户端时必须保存它。调用Response.Flush()
并不能神奇地消除带宽限制Flush()
不是一个阻塞调用—您仍然在将内容推送到内存中,IIS在尝试将数据传递到客户端时很高兴地保留着该数据。