asp.net 压缩并下载文件

xiaoxiao2021-02-28  79

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(); } }

转载请注明原文地址: https://www.6miu.com/read-34031.html

最新回复(0)