1、将服务器文件打包下载至本地(压缩包缓存到服务器下载)

(1)文件批量压缩成压缩包并缓存到服务器(公共方法)

using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;/// <summary>
/// 压缩文件(并保存至服务器)
/// </summary>
/// <param name="fileName">要压缩的所有文件(完全路径)</param>
/// <param name="name">压缩后文件路径</param>
/// <param name="Level">压缩级别</param>
public static bool ZipFileMain(List<string> filenames, string name, int Level){ZipOutputStream s = new ZipOutputStream(File.Create(name));Crc32 crc = new Crc32();//压缩级别s.SetLevel(Level); try{foreach (string file in filenames){//打开压缩文件FileStream fs = File.OpenRead(file);byte[] buffer = new byte[fs.Length];fs.Read(buffer, 0, buffer.Length);//建立压缩实体ZipEntry entry = new ZipEntry(System.IO.Path.GetFileName(file));//时间entry.DateTime = DateTime.Now;//空间大小entry.Size = fs.Length;fs.Close();crc.Reset();crc.Update(buffer);entry.Crc = crc.Value;s.PutNextEntry(entry);s.Write(buffer, 0, buffer.Length);}return true;}catch (Exception ex){return false;}finally{s.Finish();s.Close();}return true;
}

(2)实现代码

调用公共方法将文件批量压缩打包成压缩包并下载到服务器,从服务器读取压缩包下载至本地。

List<string> paths=new List<string>(){"1.txt","2.txt"
};
string strSavePath=Server.MapPath("/");
foreach(var path in paths){path=strSavePath+path;
}
string rarName="test.rar";
//调用公共方法
ZipFileMain(paths, strSavePath + rarName, 1);//下载压缩包至本地
string strServerRarPath = strSavePath + rarName;
//文件不存在重新创建
if (!File.Exists(strServerRarPath)){File.Create(strServerRarPath);
}
byte[] bytes = File.ReadAllBytes(strServerRarPath);
//通知浏览器下载文件而不是打开
context.Response.ContentType = "application/octet-stream";
context.Response.AddHeader("Content-Disposition", "attachment;filename="+HttpUtility.UrlEncode(strRarName, System.Text.Encoding.UTF8));
context.Response.BinaryWrite(bytes);
context.Response.Flush();

2、将服务器文件打包下载至本地(压缩包缓存到内存下载)

(1)将文件流压缩返回压缩后的流(公共方法)

/// <summary>
/// 将多个流进行zip压缩,返回压缩后的流.
/// </summary>
/// <param name="streams">key:文件名;value:文件名对应的要压缩的流.</param>
/// <returns>压缩后的流.</returns>
static MemoryStream PackageManyZip(Dictionary<string, Stream> streams){byte[] buffer = new byte[6500];MemoryStream returnStream = new MemoryStream();var zipMs = new MemoryStream();using (ZipOutputStream zipStream = new ZipOutputStream(zipMs)){zipStream.SetLevel(9);foreach (var kv in streams){string fileName = kv.Key;using (var streamInput = kv.Value){zipStream.PutNextEntry(new ZipEntry(fileName));while (true){var readCount = streamInput.Read(buffer, 0, buffer.Length);if (readCount > 0) zipStream.Write(buffer, 0, readCount);else break;}zipStream.Flush();}}zipStream.Finish();zipMs.Position = 0;zipMs.CopyTo(returnStream, 5600);}returnStream.Position = 0;return returnStream;
}

(2)实现代码

将服务器的批量文件以流的形式压缩成一个压缩包流,再将压缩包流下载至本地。

List<string> paths=new List<string>(){"1.txt","2.txt"
};
string strSavePath=Server.MapPath("/");
Dictionary<string, Stream> streamDic = new Dictionary<string, Stream>();
//文件转化成流
foreach(var path in paths){string FileName = path;path=strSavePath+path;//文件不存在if (!File.Exists(path)) continue;//处理文件数据Stream streamWriter = File.Open(path, FileMode.Open);if(streamDic.ContainsKey(FileName)==false){//文件不重名streamDic.Add(FileName, streamWriter);}
}
//压缩
MemoryStream ms = new MemoryStream();
ms = PackageManyZip(streamDic);
byte[] bytes = new byte[(int)ms.Length];
ms.Read(bytes, 0, bytes.Length);
ms.Close();
//通知浏览器下载文件而不是打开
string zipName = DateTime.Today.ToString("yyyy-MM-dd") + ".zip";
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(zipName, System.Text.Encoding.UTF8));
Response.BinaryWrite(bytes);
Response.Flush();

注:streamDic添加数据时,需要先判断key是否存在,如果key在streamDic中已经存在,在Add相同的key会出现异常导致程序终止运行。

C# 将服务器文件批量压缩打包下载至本地两种方法(压缩包缓存到服务器下载、压缩包缓存到内存下载)相关推荐

  1. 修改ntp服务器rac,RAC时间同步的两种方法【NTP时间同步服务器】

    在集群中的两个 Oracle RAC 节点上执行以下集群时间同步服务配置. Oracle Clusterware 11g 第 2 版及更高版本要求在部署了 Oracle RAC 的集群的所有节点上实现 ...

  2. eclipse中将项目打包成jar的两种方法,及其问题与解决方法

    eclipse中将项目打包成jar的两种方法,及其问题与解决方法 参考文章: (1)eclipse中将项目打包成jar的两种方法,及其问题与解决方法 (2)https://www.cnblogs.co ...

  3. PDF文件有限制,不能编辑,两种方法可以解决

    PDF文件有编辑限制,导致我们没办法直接编辑PDF文件,但是只要我们将限制编辑取消掉就可以编辑PDF文件了.具体操作如下: 今天和大家分享的是,在没有PDF密码,无法取消限制编辑的情况下,如何编辑PD ...

  4. PPS文件如何转换成PPT?附两种方法

    在工作中,PPS文件的使用还是很广泛的,因为作为幻灯片放映文件,点击后就能直接播放,十分方便.但如果想要修改PPS里的内容,PPS是无法编辑的,我们需要把文件转换成PPT,再进行修改. 那PPS文件如 ...

  5. PDF文件怎么压缩小一点?这两种压缩方法很好用

    PDF文件怎么压缩的小一点呢?大家在办公过程中,PDF文件可能是最常见的文件之一,大家发送文件都会使用它.使用的次数多的小伙伴也许就会察觉到,当发送内存很大的PDF文件时,会耗费我们很长时间,发送和接 ...

  6. eclipse打包项目为aar_eclipse中将项目打包成jar的两种方法,及其问题与解决方法...

    第一种:利用eclipse中自带的export功能 第一种方法分两种情况先来看第一种情况:没有引用外部jar的项目打包 步骤一:右键点击项目选择导出(export),选择java>jar文件(不 ...

  7. 有感:pycharm里面下载库的两种方法的下载路径

    我最近在下载skimage库,以前都是直接在python解释器里加号下载的,这次实在太慢了,就用了pip下载,后来还是没成功,才发现两个方式的下载路径不一样. pycharm下载库,一般有两种办法:1 ...

  8. OFD文件怎么转换成图片?这两种方法能够快速转换

    怎么将OFD文件转换成图片呢?OFD文件是我们国家自主研发的一种文件版式格式标准,大家对于这种受用面较小的文件格式见到的次数可能不多,因此也对这种格式的文件不太了解,打开它需要相关的OFD阅读软件才可 ...

  9. PDF文件怎么转换成Word?这两种方法了解一下

    怎么把PDF文件转换成Word文档呢?这两种格式的文件我们在日常办公中是最常见的,也是使用频率最高的两种文件之一.其中PDF格式的文件用来发送文件和保存文件很方便,但是有一点不好就是无法直接编辑,所以 ...

最新文章

  1. 人民币小写转大写php实现
  2. VSTO进行时––开发日志之二(VSTO Development diary II)
  3. Nexus如何上传自己的jar包 (upload artifactory)
  4. 添加/移除事件处理程序
  5. spring Transaction Management --官方
  6. 税收征收管理法律制度
  7. AI基础:词嵌入基础和Word2vec
  8. 搜索引擎学习(七)解析查询
  9. Kuskal/Prim POJ 1789 Truck History
  10. Directx11教程(55) 建立球形和锥形物体
  11. 乐观锁的一种实现方式——CAS
  12. Sharepoin学习笔记—架构系列—Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 2
  13. 数据库基础知识——流程控制结构
  14. document.createElement
  15. 解决Redis之MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on d
  16. 互联网人必读 | 大数据思维的十大核心原理
  17. pytorch在anaconda下安装
  18. 快手科技音视频技术亮相ChinaMM 首次公开多媒体传输协议KTP
  19. 中国 省 市 自治区 资料
  20. 程序员必备的几款文档编辑器

热门文章

  1. CG100-ATMEGA适配器介绍
  2. Python “贪吃蛇”魔改大赛,码出你的 Style
  3. IBM-PC汇编语言程序设计(第二版)课后习题答案(清华大学出版社)(沈美明,温冬蝉著)第三章答案
  4. Theia学习笔记(三)
  5. 课工场 “微服私访”项目学习(六)
  6. C++手写堆的实现(LuoguP3378模板)
  7. Opencv计算相机响应函数(Camera Response Function)与Radiance
  8. 网络互联技术与实践教程(汪双硕、姚羽)——第一章 网络互联设备与管理
  9. 2022年 HSC-1th中MISC的DORAEMON
  10. 陈大惠老师:sq泛滥对现代人的伤害