• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Leo-8-5-9-4
博客园    首页    新随笔    联系   管理    订阅  订阅

使用SharpCompress压缩文件后把压缩的文件流传给前端

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 总结:原理就是把文件压缩,之后读取压缩的文件的流,最后将流返回给前端调用者。

 

posted on 2022-02-17 13:58  Leo-8-5-9-4  阅读(406)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3