基于.net core api 接口返回文件流(批量打包多个文件生成zip)
防止多线程操作
上层代码如下

public class FileController : AbstractController
{//合同文件服务接口private readonly IContractFileService _contractFileService;//构造函数注入服务public FileController(IContractFileService contractFileService){_contractFileService = contractFileService;}/// <summary>/// 文件夹打包批量下载/// </summary>/// <param name="fileId">文件夹id</param>/// <returns>返回zip压缩文件流</returns>[ProducesResponseType(typeof(ContractFileEntity), 200)][HttpGet("packdownload/{fileId}")]public async Task<FileResult> Packdownload([FromRoute] string fileId){MemoryStream zipUrl = _contractFileService.Packdownload(fileId);return File(zipUrl, "application/x-zip-compressed");}
}

服务层的接口就放这儿了

 public interface IContractFileService{MemoryStream Packdownload(string fileId);}

然后下面是最底层(基于服务层接口的实现)

using System.IO;
using System.IO.Compression;
public class ContractFileServiceImpl : IContractFileService
{public MemoryStream Packdownload(string fileId){MemoryStream result = new MemoryStream();if (!string.IsNullOrEmpty(fileId)){//数据实体ContractFileEntity entity = _operateDbContext.ContractFiles.Find(fileId);if (entity == null){throw new WinkSignException("该文件不存在,请刷新页面重新试试噢!");}//当前访问线程生成的随机存放路径string randPath = $"{Directory.GetCurrentDirectory()}/Resources/{Guid.NewGuid():N}";//压缩文件的存放路径string zipPath = $"{randPath}/downfile";//最后生成压缩文件存放路径+文件名string zipName = $"{randPath}/{entity.Name}.zip";//创建存放路径Directory.CreateDirectory(zipPath);//获取所有数据(看个人项目结构获取自己想要的数据)IQueryable<ContractFileEntity> listFile = _operateDbContext.ContractFiles.Where(w => w.CompanyId == _loginUser.CompanyId && w.Path.StartsWith(entity.Path));var queryList = listFile.OrderBy(l => l.Path.Length).ToList();var queryGroup = queryList.GroupBy(l => l.Path.Length).Select(l => new{path = l.Key,list = l.ToList()}).OrderBy(r => r.path).ToList();//同级目录相同文件(夹)名重命名string ReName(string name, int i){if (name.Contains('.')){string[] _name = name.Split('.');return $"{_name[0]}{i}.{_name[1]}";}else{return $"{name}.{i}";}}//拼接父级目录string GetPath(string path, int leve){string _path = string.Empty;var _list = queryGroup.Where(q => q.path <= leve).ToList();_list.ForEach(q =>{_path += $"/{q.list.Where(_q => path.StartsWith(_q.Path)).FirstOrDefault()?.Name}";});return _path;}//按照层级分组queryGroup.ForEach(q =>{//同级循环for (int i = 0; i < q.list.Count; i++){string _path = string.Empty;if (q.list.Count(l => l.Name == q.list[i].Name) > 1){q.list[i].Name = ReName(q.list[i].Name, i);}_path = $"{zipPath}/{GetPath(q.list[i].Path, q.path)}";if (q.list[i].Type == ContractFileType.文件夹){Directory.CreateDirectory(_path);}else{using var web = new WebClient();web.DownloadFile(q.list[i].Url, _path);}}});//将第一个参数路径下的所有文件以及文件夹打包压缩成第二个参数的路径ZipFile.CreateFromDirectory(zipPath, zipName);//生成文件流result = FileToStream(zipName);//删除随机生成的路径Directory.Delete(randPath, true);}return result;}//将文件路径转为内存流public MemoryStream FileToStream(string fileName){// 打开文件FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);// 读取文件的 byte[]byte[] bytes = new byte[fileStream.Length];fileStream.Read(bytes, 0, bytes.Length);fileStream.Close();// 把 byte[] 转换成 StreamMemoryStream stream = new MemoryStream(bytes);return stream;}
}

.net core 文件夹打包下载相关推荐

  1. js多文件下载和多文件分文件夹打包下载并重命名

    js多文件下载并重命名 let list=['...'] function downloadFile(list,index){//下载文件方法if(index>=list.length){ret ...

  2. zip格式压缩文件并打包下载

    压缩文件并下载 zip格式压缩文件并打包下载 zip格式压缩文件并打包下载 Map<String, String> param = new HashMap<String, Strin ...

  3. linux将目录打包压缩,linux 文件夹打包、解压命令大全

    TAR压缩tar -zcvf /data/backup.tar.gz /wwwroot tar -zcvf   打包后生成的文件名全路径     要打包的目录 以上的例子:把/wwwroot文件夹打包 ...

  4. 计算机英语打包,英语怎么说 “把许多文件和文件夹打包成一个RAR文件”?-RAR文件...

    We usually not only send documents to others, but also send some folders. 我们平时要发送文件给别人,也要发一些文件夹, The ...

  5. php将文件夹打包zip文件,php将文件夹打包成zip文件

    php将文件夹打包成zip文件:function addFileToZip($path,$zip){ $handler=opendir($path); //打开当前文件夹由$path指定. while ...

  6. linux文件夹打包命令

    linux文件夹打包命令 .tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包,不是压缩!) --------- ...

  7. Java实现文件夹打包

    导语   接到一个需求,说是要把文件夹打包成成zip包,还要求使用Java代码来实现,想想既然是工具类,那么就来编写一个工具来试试. 废话不多说直接上代码 import java.io.Buffere ...

  8. linux将某个文件夹打包为zip文件

    将当前目录下的PocTest文件夹打包成PocTest.zip: zip -q -r PocTest.zip PocTest/

  9. 阿里云OSS文件批量打包下载

    阿里云OSS文件批量打包下载 public void downloadReport(List<String> fileNames,HttpServletResponse response) ...

最新文章

  1. [转]Introduction of iSCSI Target in Windows Server 2012
  2. CF1037H Security——SAM+线段树合并
  3. android 双击home退出程序,Android项目实战(五十五):部分机型点击home再点图标进入程序不保留再之前界面的问题...
  4. 开源的DevOps开发工具箱
  5. 儿童学文字编程python_手把手教你python数字知识
  6. 查看mysql是否启用安全审计_如何查看oracle是否开启了审计功能?
  7. 影院售票系统-----一个让你有成就感的小项目,只有一丢丢哦
  8. IDEA如何进行debug调试
  9. oracle 数据库导出
  10. 支持超过4000字节的varchar2类型
  11. sql server windows nt 64bit 占内存解决方法
  12. Tibco Designer -- 循环遍历
  13. android横竖屏切换布局闪退,Android 横竖屏切换以及横屏启动闪退问题
  14. 近期杂文集锦-数学方法谈
  15. 如何下载bing必应首页图片
  16. POJ2187-最远点对-旋转卡壳(怎么开心怎么读)
  17. 电机学他励直流发电机matlab,华南理工电机学随堂练习答案完整版
  18. css实现文字左右添加横线
  19. matplotlib的基本用法(十三)——figure绘制多图
  20. 通知栏通知不被清除通知所取消

热门文章

  1. Android开发常用开源库
  2. MATLAB课程笔记(二)——MATLAB基础知识
  3. 先学微机原理还是计算机组成原理,计算机组成原理学习指导
  4. 硬盘分区失败丢失数据如何恢复
  5. Android屏幕刷新——源码分析
  6. LinuxShell编程-脑洞实验-脚本小程序
  7. 计算机操作系统对文件进行管理的体现,计算机操作系统复习之文件管理
  8. C语言中的结构体(struct)详解
  9. 虚拟机环境下实现内网外网互相ping的方法
  10. Struts 2.0系列文章