public void batchDownload(HttpServletResponse response, Integer[] id) { //判断是否是一个,,如果是则单个下载方式下载 if (historyTaskIds.length == 1) { //单个下载的方法就不放出来啦 //download(response, id[0]); } else { List<Message> list = new ArrayList<Message>(); for (int historyTaskId : historyTaskIds) { //通过ID查询数据库得到MixerTaskHistory表数据 MixerTaskHistory mixerTaskHistory = mixerTaskHistoryDAO.findMixerTaskHistoryById(id); //得到要下载的文件的路径 String renderPath = mixerTaskHistory.getRenderPath(); String renderName = null; //下载文件命名 if (mixerTaskHistory.getOutType() == 1) {//1为视频 renderName = mixerTaskHistory.getRenderName() + ".mp4"; } if (mixerTaskHistory.getOutType() == 2) {//2为图片 renderName = mixerTaskHistory.getRenderName() + ".png"; } File file = new File(renderPath); if (!file.exists()) { throw new MyException("资源不存在,不能下载"); } else { Message message = new Message(); message.setPath(renderPath);//文件路径 message.setMessage(renderName);//文件名字 list.add(message); } } //通过UUID随机生成一个zip文件名 String uuid = UUID.randomUUID().toString(); String fileName = uuid + ".zip"; String zipName = "D:/mixer/zip/"+fileName; File zipFile = new File(zipName); try { if (!zipFile.exists()) { zipFile.createNewFile(); } } catch (Exception e) { e.printStackTrace(); logger.error("zip压缩包创建出错"); } CompressZipUtil compressZipUtil = new CompressZipUtil(); //压缩文件 boolean flag = compressZipUtil.writeZip(list,zipName); if(flag){ //下载文件 download(response,fileName,zipFile); }else { logger.error("压缩文件出现错误"); } } } //下载方法 private void download(HttpServletResponse response, String fileName, File file) { response.reset(); response.setCharacterEncoding("utf-8"); response.setContentType("multipart/form-data"); response.setHeader("Content-Disposition", "attachment;fileName=" + fileName); response.setHeader("Content-Length", String.valueOf(file.length())); //用于记录以完成的下载的数据量,单位是byte InputStream inputStream = null; OutputStream os = null; try { //打开本地文件流 inputStream = new FileInputStream(file); //激活下载操作 os = response.getOutputStream(); //循环写入输出流 byte[] b = new byte[1024 * 1024]; int length; while ((length = inputStream.read(b)) > 0) { os.write(b, 0, length); } } catch (IOException e) { e.printStackTrace(); logger.error("下载出现错误"); } finally { try { if (os != null) { os.close(); } if (inputStream != null) { inputStream.close(); } } catch (IOException e) { e.printStackTrace(); logger.error("关流出现错误"); } } } /** * 压缩文件方法 * @param files 压缩的文件的名字和路径 * @param zipName压缩包的文件路径 * @return */ public boolean writeZip(List<Message> files, String zipName){ boolean flag; try { OutputStream os = new BufferedOutputStream(new FileOutputStream(zipName)); ZipOutputStream zos = new ZipOutputStream(os); //设置文件名编码方式 zos.setEncoding("UTF-8"); byte[] buf = new byte[8192]; int len; for (int i=0;i<files.size();i++) { File file = new File(files.get(i).getPath()); if (!file.isFile()) continue; ZipEntry ze = new ZipEntry(files.get(i).getMessage()); //解决linux乱码问题 ze.setUnixMode(644); zos.putNextEntry(ze); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); while ((len = bis.read(buf)) > 0) { zos.write(buf,0, len); } zos.closeEntry(); } zos.closeEntry(); zos.close(); flag = true; }catch (Exception e){ logger.error("压缩文件出现错误"); flag = false; e.printStackTrace(); } return flag; }