java文件批量下载打包成zip
生活随笔
收集整理的這篇文章主要介紹了
java文件批量下载打包成zip
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.首先html頁面獲取當前需要下載文件的id集合將轉成字符串形式傳遞到后臺。
。。。。。。。。。。。。。。。。
2 、下面就是獲取字符串之后的批量下載/*** 多文件批量下載壓縮成zip**rootPath** */@RequiresPermissions(value = "/file/download")@RequestMapping(value = "/file/downFiles", method = RequestMethod.GET)public ModelAndView downFilesPost(HttpServletRequest request, HttpServletResponse response) {// 選中文件ID拼接的字符串// String idxs ="8abc83566c17147a016c177d9d100000,8abc83566c03a4d3016c03b388510004,8abc83566c03a4d3016c03b0ba170003";String idxs=request.getParameter("ids");List<String> downLoadPaths = new ArrayList<String>();//存儲選中文件的下載地址OutputStream res = null;ZipOutputStream zos = null;String outPath;String lessionIdStr;String fileName; //瀏覽器下載彈出框中顯示的文件名downLoadPaths.clear();String firstFileName = "";// 第一個文件的文件名List<mtrbTrainFileModel> fileVos = new LinkedList<mtrbTrainFileModel>();if (StringUtils.isNotEmpty(idxs)) {int end = idxs.lastIndexOf(",");if (end > 0) {if (end == idxs.length() - 1) {idxs = idxs.substring(0, end);}String[] ids = idxs.split(",");for (int i = 0; i < ids.length; i++) {mtrbTrainFileModel mtrbmodel = trainFileService.get(mtrbTrainFileModel.class, (ids[i]));fileVos.add(mtrbmodel);//拼接urlString url = rootPath + mtrbmodel.getFileUrl();downLoadPaths.add(url);}if (downLoadPaths.size() != 0) {byte[] buf = new byte[8192];int len;try {String zipName = "【批量下載】" + fileVos.get(0).getFileName() + "等.zip";String filename = "";filename = new String(zipName.getBytes("utf-8"), "ISO8859_1");res = response.getOutputStream();// 清空輸出流(在迅雷下載不會出現一長竄)response.reset();// 設定輸出文件頭response.setHeader("Content-Disposition", "attachment;fileName="+ filename);response.setContentType("application/zip");zos = new ZipOutputStream(res);for (mtrbTrainFileModel fileVo : fileVos) {File file=new File(rootPath+fileVo.getFileUrl());//設置后綴格式String[] fileN = fileVo.getFileUrl().split("\\.");ZipEntry ze = new ZipEntry(fileVo.getFileName() + "." + fileN[1]);zos.putNextEntry(ze);BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));while ((len = bis.read(buf)) > 0) {zos.write(buf, 0, len);}bis.close();zos.closeEntry();}
/*if (i == 0) {//只有一個的時候// firstFileName = lession.getLessionName();}*/} catch (Exception e) {e.printStackTrace();}}try{if (zos != null) {zos.close();}if (res != null) {res.close();}}catch (Exception e){e.printStackTrace();}}else{ModelAndView mav = new ModelAndView();mav.setViewName("forward:/file/downFile?fileId="+idxs);return mav;//System.out.print("ddd");}}return null;}
/*** 下載培訓文件(僅一條)* syq** */
@RequiresPermissions(value = "/file/download")
@RequestMapping(value = "/file/downFile", method = RequestMethod.GET)
public void downFilePost(HttpServletRequest request,HttpServletResponse response ) {String fileId = request.getParameter("fileId");mtrbTrainFileModel mtrbmodel = trainFileService.get(mtrbTrainFileModel.class, fileId);//拼接urlString url=rootPath+mtrbmodel.getFileUrl();//設置后綴格式String []fileN=mtrbmodel.getFileUrl().split("\\.");String fileName=mtrbmodel.getFileName()+"."+fileN[1];File file= new File(url);//若文件不存在if ( !file.exists()) {response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");//設置響應內容和編碼規則OutputStream out = null;try {response.getWriter().print("<script type='text/javascript'>alert('文件不存在 ')</script>");response.getWriter().close();} catch (IOException e) { e.printStackTrace();}finally{try { if(out != null){out.close(); }} catch (IOException e) { e.printStackTrace(); }}}// -----------------------------------------------------FileInputStream fis = null;OutputStream toClient = null;try {String agent = request.getHeader("USER-AGENT");if (null != agent && -1 != agent.indexOf("MSIE")) {String encodeName = URLEncoder.encode(fileName, "UTF-8");encodeName = encodeName.replaceAll("\\+", "%20");//處理空格,空格會被編碼成+,轉化為%20if (-1 != agent.indexOf("MSIE 6.0") && encodeName.length() > 150) {//IE6下最長支持150個字符左右,一個漢字占9位編碼,最多17個漢字//這個方式在IE8下 字符集在gb2312內的是可以的,IE6又不支持,那IE6下面超過15個漢字就只能被自動截斷了...//fileName=new String(fileName.getBytes("gb2312"),"ISO8859-1");//如果文件名里面包含了非gb2312編碼的字,比如繁體字,就不行了呀fileName = encodeName;//如有解決辦法,更改此行} else {fileName = encodeName;}} else if (null != agent && -1 != agent.toLowerCase().indexOf("rv:11")) {fileName = URLEncoder.encode(fileName, "UTF-8");} else {fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");}// 清空responseresponse.reset();// response.setContentType("text/html;charset=utf-8");// 設置response的Header//response.addHeader("Content-Disposition", "attachment;filename="+ new String(fileName.getBytes()));response.addHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\"");//火狐讀取文件名時,遇到空格就只取空格前面的,把文件名用雙引引起來就好了//response.addHeader("Content-Length", "" + file.length());fis = new FileInputStream(file);System.out.print("url=="+url);//toClient = new BufferedOutputStream(response.getOutputStream());toClient = response.getOutputStream();byte[] buffer = new byte[1024];// while (true) {int lengths = 0;lengths= fis.read(buffer);while (lengths != -1) {toClient.write(buffer, 0, lengths);lengths=fis.read(buffer);}// }// response.setContentType("application/vnd.ms-excel;charset=utf-8");// toClient.flush();} catch (Exception e) {e.printStackTrace();} finally {try {if (toClient != null) {toClient.close();}} catch (IOException e) {e.printStackTrace();}try {if (fis != null) {fis.close();}} catch (IOException e) {e.printStackTrace();}System.out.print("結束上傳!準備寫入日志文件!");LogUtil.saveLog("uoloadFile", "下載文件:" + mtrbmodel.getFileName(), trainFileService);}}
總結
以上是生活随笔為你收集整理的java文件批量下载打包成zip的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Swift教程-视频拍摄教程
- 下一篇: 【办公应用软件】万彩办公大师丨PDF页面