1 SharpCompress版本 0.30.1
2 应用场景:前端传递某个标识符,如Id,查询和该Id相关联的文件,并把文件压缩,最后返回给前端。适用于压缩多个体积较小的文件,如果文件体系过大,可能会消耗过多服务器内存和硬盘的资源。
具体代码如下:
// 引入命名空间 using SharpCompress.Common; using SharpCompress.Writers;
// 文件的部分url 如localhost:8080/abc/image/agdg.jpg,这里部分url的意思是 //类似这样的“abc/image/agdg.jpg”url。变量originFileUrlList存储的信息是部分url组成的集合。这是业务决定的,具体问题具体分析。 var originFileUrlList = originFileList.Select(x => x.response.data).ToList(); // 准备拼接文件完整路径 var fileInfo = new List<FileInfo> { }; var currentDirectory = Directory.GetCurrentDirectory(); for (int i = 0; i < originFileUrlList.Count; i++) { originFileUrlList[i] = currentDirectory + "/TemporaryFiles" + originFileUrlList[i]; fileInfo.Add(new FileInfo(originFileUrlList[i])); } // 临时目录 用于存放压缩产生的zip文件 var tempPath = currentDirectory + "/TemporaryFiles" + @"\压缩包.zip"; #region 解决中文字符乱码问题 // 如果文件名含有中文字符,需要指定编码以避免文件名乱码 ArchiveEncoding archiveEncoding = new ArchiveEncoding { Default = Encoding.GetEncoding("utf-8") }; WriterOptions options = new WriterOptions(CompressionType.Deflate) { ArchiveEncoding = archiveEncoding }; #endregion using (FileStream stream = new FileStream(tempPath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { using (var zipWriter = WriterFactory.Open(stream, ArchiveType.Zip, options)) { foreach (var file in fileInfo) { zipWriter.Write(file.Name, file); } } } byte[] buffer = null; using (FileStream fileStream = System.IO.File.OpenRead(tempPath)) { buffer = new byte[fileStream.Length]; fileStream.Read(buffer, 0, buffer.Length); } System.IO.File.Delete(tempPath); var fileName= "压缩包" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".zip"; return File(buffer, "application/octet-stream", fileName);
3 总结:原理就是把文件压缩,之后读取压缩的文件的流,最后将流返回给前端调用者。