功能要求:教师端要将学生上传的报告按班级进行打包下载。

前台HTML如下:

<td align="right"><button class="layui-btn layui-btn-sm" data-toggle="modal" onclick="downloadAllAttachment()"><i class="layui-icon"></i> 下载全部附件</button>
</td> 

JS部分通过ajax发送请求到后台的downloadAllAttachment()函数为如下:

function downloadAllAttachment() {$.ajax({type : 'get',data:{"courseId":getUrlParam("courseId"),"teacherId":getUrlParam("teacherId"),"theClassId":getUrlParam("theClassId"),"taskId": getUrlParam("taskId")},url : "/summaryRecord/downloadAllAttachment",success : function(data) {if(data == "文件下载出错") {layer.msg("文件下载出错了!",{icon:2});}else {var url= '../../resources/SummaryRecord/'+data;location.href=url;}}});}

后台Controller中的方法:

@RequestMapping(value = "/downloadAllAttachment",method = RequestMethod.GET)@ResponseBody@ApiOperation(value = "教师端下载所有学生的报告附件")public String downloadAllAttachment(String courseId, String teacherId, String theClassId, String taskId,HttpServletRequest request, HttpServletResponse response ) throws Exception {String filePath = filesPath+"/SummaryRecord/"+teacherId+"/"+courseId+"/"+taskId+"/"+theClassId;String zipPath =  FileUtil.downloadAllAttachment(filePath,request,response);zipPath = zipPath.substring(zipPath.indexOf(teacherId));return  zipPath;}

FIleUtil的方法将打包压缩后的文件路径返回给前台,从而实现点击下载的功能。注意:每次在该方法中要先判断一下该压缩文件是不是已经存在,如果已经存在则进行删除,然后在继续打包进行压缩,这样做是为了避免在上一次打包和这一次打包的时候有学生提交新的报告。具体的代码如下:


//以下为老师打包下载全部学生的报告public static String downloadAllAttachment(String filePath, HttpServletRequest request, HttpServletResponse response) throws Exception {File dirFile = new File(filePath) ;ArrayList<String> allFilePath = Dir(dirFile);List<File> filesList = new ArrayList<>();File[] files=new File[allFilePath.size()];String path;for (int j = 0; j < allFilePath.size(); j++) {path=allFilePath.get(j);File file = new File(path);files[j]=file;filesList.add(file);}return  downLoadFiles(filesList,filePath,request,response);}//获取文件夹下的所有文件的路径public static ArrayList<String> Dir(File dirFile) throws Exception {ArrayList<String> dirStrArr = new ArrayList<String>();if (dirFile.exists()) {//直接取出利用listFiles()把当前路径下的所有文件夹、文件存放到一个文件数组File files[] = dirFile.listFiles();for (File file : files) {//如果传递过来的参数dirFile是以文件分隔符,也就是/或者\结尾,则如此构造if (dirFile.getPath().endsWith(File.separator)) {dirStrArr.add(dirFile.getPath() + file.getName());} else {//否则,如果没有文件分隔符,则补上一个文件分隔符,再加上文件名,才是路径dirStrArr.add(dirFile.getPath() + File.separator+ file.getName());}}}return dirStrArr;}//下载文件public static String downLoadFiles(List<File> files,String filePath ,HttpServletRequest request, HttpServletResponse response) throws Exception {try {//这里的文件你可以自定义是.rar还是.zipfilePath = filePath+"教学班全部附件.zip";File file = new File(filePath);if (!file.exists()){file.createNewFile();}else{//如果压缩包已经存在则删除后重新打包压缩file.delete();}response.reset();//创建文件输出流FileOutputStream fous = new FileOutputStream(file);/**打包的方法用到ZipOutputStream这样一个输出流,所以这里把输出流转换一下*/ZipOutputStream zipOut = new ZipOutputStream(fous);/**这个方法接受的就是一个所要打包文件的集合,还有一个ZipOutputStream*/zipFiles(files, zipOut);zipOut.close();fous.close();//SummaryRecord/2/3/1536360821177/2018教学班全部附件.zipreturn filePath;}catch (Exception e) {e.printStackTrace();//return "文件下载出错" ;}return "文件下载出错";}//把接受的全部文件打成压缩包public static void zipFiles(List files,ZipOutputStream outputStream) {int size = files.size();for(int i = 0; i < size; i++) {File file = (File) files.get(i);zipFile(file, outputStream);}}//将单个文件打包public static void zipFile(File inputFile,ZipOutputStream ouputStream) {try {if (inputFile.exists()) {if (inputFile.isFile()) {FileInputStream IN = new FileInputStream(inputFile);BufferedInputStream bins = new BufferedInputStream(IN, 512);//org.apache.tools.zip.ZipEntryZipEntry entry = new ZipEntry(inputFile.getName());ouputStream.putNextEntry(entry);// 向压缩文件中输出数据int nNumber;byte[] buffer = new byte[512];while ((nNumber = bins.read(buffer)) != -1) {ouputStream.write(buffer, 0, nNumber);}//关闭创建的流对象bins.close();IN.close();} else {try {File[] files = inputFile.listFiles();for (int i = 0; i < files.length; i++) {zipFile(files[i], ouputStream);}} catch (Exception e) {e.printStackTrace();}}}} catch (Exception e) {e.printStackTrace();}}

【java】 将服务器上文件夹上所有文件打包并下载相关推荐

  1. 文件夹内多文件上传到服务器

    文件夹上传至服务器 希望可以给你一点帮助 直接上代码 jsp页面 <div style="text-align:center; vertical-align:middel" ...

  2. python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏。 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小

    python 实现统计ftp服务器指定目录下文件夹数目.文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏. 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小,类 ...

  3. java 文件下载 组件_java文件夹上传下载组件

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. *如何分片: *如何合成一个文件: *中断了从哪个分片开始. ...

  4. java+http文件夹上传

    在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...

  5. java+上传整个文件夹的所有文件

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  6. 服务器上reportqueue文件夹,删除reportqueue文件夹的操作方法-电脑自学网

    删除reportqueue文件夹的操作方法. Win7系统删除reportqueue文件夹操作方法: 1.首先要打开reportqueue文件夹,reportqueue文件夹在C盘的C:\Progra ...

  7. 文件上传控件-如何上传文件-文件夹上传

    需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制. PC端全平台支持,要求支持Window ...

  8. Nginx 实现文件夹上传(保留目录结构)

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

  9. BS文件夹上传操作(二) ——基本功能实现

    上篇<BS文件夹上传操作 >大概说明了我所需要的需求, 接着上次的命题:  "如果有一个需求,要求你在BS上实现文件夹上传操作功能?你该如何实现?" ActiveX?J ...

  10. vue文件夹上传组件选哪个好?

    一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传: 支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输 ...

最新文章

  1. python引用文件的方法_[项目实践] python文件路径引用的
  2. mysql命令的分类_MySQL常用命令分类汇总
  3. 沦为一个教师——地震余震篇
  4. USB 之三 常用抓包/协议分析工具(Bus Hound、USBlyzer、USBTrace、USB Monitor Pro等)
  5. python批量发送邮件_Python批量发送邮件
  6. rest web服务_在WildFly的REST Web服务中与Jackson的双向关系
  7. html控制图的宽,用JointJS做一个简单的功能控制图
  8. vue 获取元素高度
  9. printf参数的问题
  10. Java分数的加减乘除
  11. 运维自动化之殇 | 高效运维最佳实践05
  12. rockchip wificountry code
  13. c++ 统计指定字母开头单词的数量
  14. LVS+Keepalived之DR模式配置
  15. Linux-数据库自动备份
  16. 图解 JavaScript 对象
  17. TMS Sphinx Alexandria Full Source
  18. Fintech公开课丨黄嵩:数字化转型本质论
  19. JixiPix Hand Tint Pro for Mac(图片处理软件)
  20. ubuntu18.04安装coturn(编译安装还是apt安装)

热门文章

  1. 个性化简书App上传的图片
  2. 百度网盘分享——电子专业学习视频教程
  3. 无人驾驶之MATLAB无人驾驶工具箱学习(1)
  4. python怎么识别log函数_log函数图像_函数图像_python函数图像 - 云+社区 - 腾讯云
  5. 如何准确查询网易邮箱和微软邮箱的注册时间
  6. 2021年安全员-A证(山东省-2021版)考试报名及安全员-A证(山东省-2021版)考试试题
  7. 数据仓库建模(三):事实表的设计
  8. 学校校园教务老师选课排课系统 毕业设计毕设源码毕业论文参考(4)系统管理员功能
  9. 能不能推荐几本 C++ 的书?
  10. xposed开发11 - 微信红包