- **
java文件压缩成zip文件下载
**
-
服务器上多文件下载,zip文件下载
-
优化重复文件名报错问题
/** * req 请求头 * response 返回体 * fileInfoList 文件实体类,没实体类的话直接构造List<Map>即可 * fileName 压缩文件名称 */ public void downForZip(HttpServletRequest req, HttpServletResponse response, List<BdcdjFiles> fileInfoList, String fileName) { // 创建临时文件 File zipFile = null; FileInputStream fis = null; BufferedInputStream buff = null; try { //临时文件名称 zipFile = File.createTempFile("test", ".zip"); FileOutputStream fot = new FileOutputStream(zipFile); // 为任何OutputStream产生校验,第一个参数是制定产生校验和的输出流,第二个参数是指定Checksum的类型 (Adler32(较快)和CRC32两种) CheckedOutputStream cos = new CheckedOutputStream(fot, new Adler32()); // 用于将数据压缩成Zip文件格式 ZipOutputStream zos = new ZipOutputStream(cos); Set<String> fileNameSet = new HashSet<>(); int flag = 1; for (BdcdjFiles file: fileInfoList) { String[] strs = file.getFilepath().split("/"); String itemFileName = strs[strs.length-1]; //根据文件信息获取输入流。这个看实际的业务目的就是获取当前文件的输入流 File itemFile = new File(uploadPath + file.getFilepath().replace(fileUrl, "")); if (!itemFile.exists()) { continue; } InputStream inputStream = new FileInputStream(uploadPath + "/" + itemFileName); // 对于每一个要被存放到压缩包的文件,都必须调用ZipOutputStream对象的putNextEntry()方法,确保压缩包里面文件不同名 //多个文件名称重复时zos.putNextEntry()会报错!! 可以再文件名称后面加编号等操作 if (fileNameSet.contains(file.getFilename())){ String[] name = file.getFilename().split("\\."); String newName = name[0] + flag + "." + name[1]; zos.putNextEntry(new ZipEntry(newName)); fileNameSet.add(newName); flag++; } else { zos.putNextEntry(new ZipEntry(file.getFilename())); fileNameSet.add(file.getFilename()); } zos.putNextEntry(new ZipEntry(file.getFilename())); int bytesRead = 0; // 向压缩文件中输出数据 while ((bytesRead = inputStream.read()) != -1) { zos.write(bytesRead); } inputStream.close(); // 当前文件写完,写入下一个文件 zos.closeEntry(); } zos.close(); ServletOutputStream os = response.getOutputStream(); //下载文件,使用spring框架中的FileCopyUtils工具 response.setCharacterEncoding("GB2312"); response.setContentType(req.getSession().getServletContext().getMimeType(fileName)); //设置响应头,attachment表示以附件的形式下载,inline表示在线打开 response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); fis = new FileInputStream(zipFile); buff = new BufferedInputStream(fis); FileCopyUtils.copy(buff, os); } catch (Exception e1) { throw new BzywException("批量下载失败"); // 关闭流 } finally { try { if (null != fis) { fis.close(); } if (null != buff) { buff.close(); } } catch (IOException e) { log.error( "流关闭异常"); } // 删除临时文件 if (null != zipFile) { zipFile.delete(); } } }