1、分块读取文件并添加到压缩列表中,然后创建压缩文件(使用ICSharpCode.SharpZipLib.dll, v0.86.0.518)
string zipFileName = MatchPath(context, System.IO.Path.GetFileNameWithoutExtension(excelsavepath) + ".zip");
ZipEntryFactory zipEntryFactory = new ZipEntryFactory();
zipEntryFactory.NameTransform = new MyNameTransfom(renameDictionary);
using (ZipOutputStream outPutStream = new ZipOutputStream(File.Create(zipFileName)))
{
outPutStream.SetLevel(9);
ZipEntry entry = null;
byte[] buffer = null;
foreach (string file in renameDictionary.Keys)
{
if (File.Exists(file) == false)
continue;
buffer = new byte[4096];
entry = zipEntryFactory.MakeFileEntry(file);
outPutStream.PutNextEntry(entry);
using (FileStream fileStream = File.OpenRead(file))
{
StreamUtils.Copy(fileStream, outPutStream, buffer);
//count = 0;
//while ((count = fileStream.Read(buffer, 0, buffer.Length)) > 0)
//{
// outPutStream.Write(buffer, 0, count);
//}
}
}
outPutStream.Finish();
outPutStream.Close();
}
GC.Collect();
GC.WaitForPendingFinalizers();
2、后端输出压缩文件。分块输出下载文件(只针对比较大文件的处理,避免出现内存溢出的情况)
/// <summary>
/// 使用OutputStream.Write分块下载文件,参数为文件绝对路径
/// </summary>
/// <param name="FileName"></param>
public static void DownLoadFile(HttpContext context,string filePath)
{
//指定块大小
long chunkSize = 204800;
//建立一个200K的缓冲区
byte[] buffer = new byte[chunkSize];
//已读的字节数
long dataToRead = 0;
context.Response.Clear();
context.Response.ClearContent();
context.Response.ClearHeaders();
context.Response.ContentType = "application/octet-stream";
string encodeFileName = Path.GetFileName(filePath);
if (context.Request.UserAgent.ToLower().IndexOf("msie") > -1)
encodeFileName = HttpUtility.UrlPathEncode(encodeFileName);
if (context.Request.UserAgent.ToLower().IndexOf("firefox") > -1)
encodeFileName = "\"" + encodeFileName + "\"";
else
encodeFileName = HttpUtility.UrlEncode(encodeFileName, System.Text.Encoding.UTF8);
try
{
using (FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
dataToRead = stream.Length;
context.Response.AddHeader("Content-Disposition", "attachement;filename=" + encodeFileName);
context.Response.AddHeader("Content-Transfer-Encoding", "binary");
context.Response.AddHeader("Content-Length", dataToRead.ToString());
while (dataToRead > 0)
{
if (context.Response.IsClientConnected)
{
int length = stream.Read(buffer, 0, Convert.ToInt32(chunkSize));
context.Response.OutputStream.Write(buffer, 0, length);
context.Response.Flush();
buffer = new Byte[chunkSize];
dataToRead = dataToRead - length;
}
else
dataToRead = -1;
}
}
}
catch (Exception)
{
throw;
}
finally
{
//context.Response.Close();
}
}