javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)
原博客地址:https://blog.csdn.net/weixin_37766296/article/details/80044000
将多个文件压缩并下载下来:(绿色为修改原博客的位置)
注意:需要使用<a>标签来调用此方法,ajax不管用无法弹出选择下载位置的弹窗
@RequestMapping("/uploads") public void recursion(String root, Vector<java.io.File> vecFile,HttpServletResponse response,HttpServletRequest request) throws IOException{ //根据路径生成一个文件 root = "d:\\upload\\A-1-1-\\0001\\001\\001"; java.io.File file = new java.io.File(root); java.io.File[] subFile = file.listFiles(); //遍历文件里面的所有文件 for (int i = 0; i < subFile.length; i++) { /*如果是文件夹,则递归下去寻找文件夹里面的文件*/ if (subFile[i].isDirectory()) { //recursion(subFile[i].getAbsolutePath(), vecFile); } else { //如果不是文件夹的话就直接添加到vector容器里面去 //将遍历出来的文件进行压缩和下载: // String filename = subFile[i].getName(); // vecFile.add(filename); vecFile.add(subFile[i]); } } //设置下载文件的名称 String fileName = "temp1.zip"; response.setContentType("text/html; charset=UTF-8"); // 设置编码字符 response.setContentType("application/x-msdownload"); // 设置内容类型为下载类型 response.setHeader("Content-disposition", "attachment;filename=" + fileName);// 设置下载的文件名称 OutputStream out = response.getOutputStream(); // 创建页面返回方式为输出流,会自动弹出下载框 //创建压缩文件需要的空的zip包 String zipBasePath = request.getSession().getServletContext().getRealPath("/logs/2/"); /* 输出basePath的路径,方便调试 */ System.out.println(zipBasePath); /* 创建压缩文件需要的空的zip包 ,这里是自动生成的,不用我们自己去生成 */ String zipFilePath = zipBasePath + "temp.zip"; System.out.println("create the empty zip file successfully??????"); //根据临时的zip压缩包路径,创建zip文件 java.io.File zip = new java.io.File(zipFilePath); if (!zip.exists()) { zip.createNewFile(); } System.out.println("create the zip file successfully"); // 创建zip文件输出流 FileOutputStream fos = new FileOutputStream(zip); ZipOutputStream zos = new ZipOutputStream(fos); System.out.println("create the empty zip stream successfully"); //循环读取文件路径集合,获取每一个文件的路径(将文件一个一个进行压缩) for (java.io.File fp : vecFile) { zipFile(fp, zos); // 将每一个文件写入zip文件包内,即进行打包 } System.out.println("get the path successfully"); // fos.close();//如果这样关两次的话会报错,java.io.IOException: Stream closed zos.close(); System.out.println("ok??"); //将打包后的文件写到客户端,使用缓冲流输出 InputStream fis = new BufferedInputStream(new FileInputStream(zipFilePath)); byte[] buff = new byte[4096]; int size = 0; while ((size = fis.read(buff)) != -1) { out.write(buff, 0, size); } System.out.println("package is packed successfully"); //释放和关闭输入输出流 out.flush();//清楚缓存 out.close(); fis.close(); } /** * 文件压缩的方法 * @param inputFile * @param zipoutputStream */ public void zipFile(java.io.File inputFile, ZipOutputStream zipoutputStream) { try { if (inputFile.exists()) { // 判断文件是否存在 if (inputFile.isFile()) { // 判断是否属于文件,还是文件夹 // 创建输入流读取文件 FileInputStream fis = new FileInputStream(inputFile); BufferedInputStream bis = new BufferedInputStream(fis); // 将文件写入zip内,即将文件进行打包 ZipEntry ze = new ZipEntry(inputFile.getName()); // 获取文件名 zipoutputStream.putNextEntry(ze); // 写入文件的方法,同上 byte[] b = new byte[1024]; long l = 0; while (l < inputFile.length()) { int j = bis.read(b, 0, 1024); l += j; zipoutputStream.write(b, 0, j); } // 关闭输入输出流 bis.close(); fis.close(); } else { // 如果是文件夹,则使用穷举的方法获取文件,写入zip try { java.io.File[] files = inputFile.listFiles(); for (int i = 0; i < files.length; i++) { zipFile(files[i], zipoutputStream); } } catch (Exception e) { e.printStackTrace(); } } } } catch (Exception e) { e.printStackTrace(); } }
对于单个文件下载:
可以参考:https://blog.csdn.net/alan_liuyue/article/details/72772502
参考博文:https://blog.csdn.net/alan_liuyue/article/details/72772502(里面关于流的关闭有点瑕疵)