打包下載word+
阿新 • • 發佈:2018-11-25
/*打包下載*/ @RequestMapping(params = "loadZip") public String Files(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("FSDYGCXXID"); if (id == null) { id = dygc_id; } String[] Arr = id.split(","); String ids = ""; for (String s : Arr) { ids += "'"+ s +"',"; } if (Arr.length == 1 ) { String sql = String.format("select b.FILEPATH,b.FILENAME,a.FSPX,a.FSZH,a.FSPROINSID from t_dygcgl_dygcxx_qbs a LEFT JOIN t_sys_files b on a.ID = b.MAINTABLEID LEFT JOIN act_hi_procinst c on a.FSPROINSID = c.PROC_INST_ID_ WHERE a.FSDYGCXXID = '%s' and c.END_ACT_ID_ = 'endevent1'",id ); List<Map<String, Object>> lst= systemService.findForJdbc(sql) ; List<Map<String, Object>> files = new ArrayList<Map<String, Object>>(); List<Map<String, Object>> name = new ArrayList<Map<String, Object>>(); String root = request.getSession().getServletContext().getRealPath("/"); //File Allfile = new File(request.getSession().getServletContext().getRealPath("/")); int s = 1; if(lst!=null && lst.size()>0){ for(int i =0;i<lst.size();i++){ Map<String, Object> mp = new HashMap<String, Object>(); Map<String, Object> mps = new HashMap<String, Object>(); if (lst.get(i).get("FILEPATH") != null) { File file = new File(root+lst.get(i).get("FILEPATH")); String names = lst.get(i).get("FILENAME").toString(); names = names + s; s++; String fspx = lst.get(i).get("FSPX").toString(); String fszh = lst.get(i).get("FSZH").toString(); mp.put("PATH", file); mps.put("name", names); mps.put("fspx", fspx); mps.put("fszh", fszh); if(file.exists()){ files.add(mp); name.add(mps); } } } String sqlpdf = String.format("select b.FILEPATH,b.FILENAME,a.FSPX,a.FSZH,a.FSPROINSID from t_dygcgl_dygcxx_qbs a LEFT JOIN t_sys_files b on a.ID = b.MAINTABLEID LEFT JOIN act_hi_procinst c on a.FSPROINSID = c.PROC_INST_ID_ WHERE a.FSDYGCXXID = '%s' and c.END_ACT_ID_ = 'endevent1' and b.CODEID = 'qbsysb' ",id ); List<Map<String, Object>> lstpdf= systemService.findForJdbc(sqlpdf) ; if(lstpdf!=null && lstpdf.size()>0){ for(int i =0;i<lstpdf.size();i++){ Map<String, Object> mp = new HashMap<String, Object>(); Map<String, Object> mps = new HashMap<String, Object>(); if (lstpdf.get(i).get("FILEPATH") != null) { String url = lstpdf.get(i).get("FILEPATH").toString(); url = StringUtils.substringBefore(url,"."); String urlname = url + ".pdf"; File file = new File(root+urlname); String names = lstpdf.get(i).get("FILENAME").toString(); String fspx = lstpdf.get(i).get("FSPX").toString(); String fszh = lstpdf.get(i).get("FSZH").toString(); mp.put("PATH", file); mps.put("name", names); mps.put("fspx", fspx); mps.put("fszh", fszh); if(file.exists()){ files.add(mp); name.add(mps); } } } } } String sqls = String.format("select fsdygcmc from t_dygcgl_dygcxx where id = '%s'",id ); Map<String, Object> map = systemService.findOneForJdbc(sqls); String fileName = map.get("fsdygcmc").toString() + ".zip"; String userAgent = request.getHeader("user-agent"); userAgent = userAgent ==null?"":userAgent.toLowerCase(); String names = fileName; try { if(userAgent.contains("msie") ||userAgent.contains("trident")){ names = URLEncoder.encode(names, "UTF-8"); }else{ response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + names+".cer"); } } catch (Exception e) { response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + names+".cer"); } // 在伺服器端建立打包下載的臨時檔案 String outFilePath = request.getSession().getServletContext().getRealPath("/") + "download/"; File file_1 =new File(outFilePath); //如果資料夾不存在則建立 if (!file_1 .exists() && !file_1 .isDirectory()) { System.out.println("//不存在"); file_1 .mkdir(); } File fileZip = new File(outFilePath + names); // 檔案輸出流 FileOutputStream outStream = new FileOutputStream(fileZip); // 壓縮流 ZipOutputStream toClient = new ZipOutputStream(outStream); //toClient.setEncoding("gbk"); zipFiles(files, toClient,name); toClient.close(); outStream.close(); this.downloadFiles(fileZip, response, true); return null; }else { List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); String[] Arrs = id.split(","); for (String FSDYGCXXID : Arrs) { String sql = String.format("select b.FILEPATH,b.FILENAME,a.FSPX,a.FSZH,a.FSPROINSID from t_dygcgl_dygcxx_qbs a LEFT JOIN t_sys_files b on a.ID = b.MAINTABLEID LEFT JOIN act_hi_procinst c on a.FSPROINSID = c.PROC_INST_ID_ WHERE a.FSDYGCXXID = '%s' and c.END_ACT_ID_ = 'endevent1'",FSDYGCXXID ); List<Map<String, Object>> lst= systemService.findForJdbc(sql) ; List<Map<String, Object>> files = new ArrayList<Map<String, Object>>(); List<Map<String, Object>> name = new ArrayList<Map<String, Object>>(); String root = request.getSession().getServletContext().getRealPath("/"); //File Allfile = new File(request.getSession().getServletContext().getRealPath("/")); if(lst!=null && lst.size()>0){ for(int i =0;i<lst.size();i++){ if (lst.get(i).get("FILEPATH") != null) { Map<String, Object> mp = new HashMap<String, Object>(); Map<String, Object> mps = new HashMap<String, Object>(); File file = new File(root+lst.get(i).get("FILEPATH")); String names = lst.get(i).get("FILENAME").toString(); String fspx = lst.get(i).get("FSPX").toString(); String fszh = lst.get(i).get("FSZH").toString(); mp.put("PATH", file); mps.put("name", names); mps.put("fspx", fspx); mps.put("fszh", fszh); if(file.exists()){ files.add(mp); name.add(mps); } } } String sqlpdf = String.format("select b.FILEPATH,b.FILENAME,a.FSPX,a.FSZH,a.FSPROINSID from t_dygcgl_dygcxx_qbs a LEFT JOIN t_sys_files b on a.ID = b.MAINTABLEID LEFT JOIN act_hi_procinst c on a.FSPROINSID = c.PROC_INST_ID_ WHERE a.FSDYGCXXID = '%s' and c.END_ACT_ID_ = 'endevent1' and b.CODEID = 'qbsysb' ",FSDYGCXXID); List<Map<String, Object>> lstpdf= systemService.findForJdbc(sqlpdf) ; if(lstpdf!=null && lstpdf.size()>0){ for(int i =0;i<lstpdf.size();i++){ Map<String, Object> mp = new HashMap<String, Object>(); Map<String, Object> mps = new HashMap<String, Object>(); if (lstpdf.get(i).get("FILEPATH") != null) { String url = lstpdf.get(i).get("FILEPATH").toString(); url = StringUtils.substringBefore(url,"."); String urlname = url + ".pdf"; File file = new File(root+urlname); String names = lstpdf.get(i).get("FILENAME").toString(); String fspx = lstpdf.get(i).get("FSPX").toString(); String fszh = lstpdf.get(i).get("FSZH").toString(); mp.put("PATH", file); mps.put("name", names); mps.put("fspx", fspx); mps.put("fszh", fszh); if(file.exists()){ files.add(mp); name.add(mps); } } } } } String sqls = String.format("select fsdygcmc from t_dygcgl_dygcxx where id = '%s'",FSDYGCXXID ); Map<String, Object> map = systemService.findOneForJdbc(sqls); String fileName = map.get("fsdygcmc").toString() + ".zip"; String userAgent = request.getHeader("user-agent"); userAgent = userAgent ==null?"":userAgent.toLowerCase(); String names = fileName; try { if(userAgent.contains("msie") ||userAgent.contains("trident")){ names = URLEncoder.encode(names, "UTF-8"); }else{ response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + names+".cer"); } } catch (Exception e) { response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + names+".cer"); } // 在伺服器端建立打包下載的臨時檔案 String outFilePath = request.getSession().getServletContext().getRealPath("/") + "download/"; File file_1 =new File(outFilePath); //如果資料夾不存在則建立 if (!file_1 .exists() && !file_1 .isDirectory()) { System.out.println("//不存在"); file_1 .mkdir(); } File fileZip = new File(outFilePath + names); // 檔案輸出流 FileOutputStream outStream = new FileOutputStream(fileZip); // 壓縮流 ZipOutputStream toClient = new ZipOutputStream(outStream); //toClient.setEncoding("gbk"); zipFiles(files, toClient,name); toClient.close(); outStream.close(); Map<String, Object> mp = new HashMap<String, Object>(); mp.put("fileZip", fileZip); list.add(mp); } String fileName = "單元工程word合併下載" + ".zip"; String userAgent = request.getHeader("user-agent"); userAgent = userAgent ==null?"":userAgent.toLowerCase(); String names = fileName; try { if(userAgent.contains("msie") ||userAgent.contains("trident")){ names = URLEncoder.encode(names, "UTF-8"); }else{ response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + names+".cer"); } } catch (Exception e) { response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + names+".cer"); } // 在伺服器端建立打包下載的臨時檔案 String outFilePath = request.getSession().getServletContext().getRealPath("/") + "download/"; File file_1 =new File(outFilePath); //如果資料夾不存在則建立 if (!file_1 .exists() && !file_1 .isDirectory()) { System.out.println("//不存在"); file_1 .mkdir(); } File fileZip = new File(outFilePath + names); // 檔案輸出流 FileOutputStream outStream = new FileOutputStream(fileZip); // 壓縮流 ZipOutputStream toClient = new ZipOutputStream(outStream); //toClient.setEncoding("gbk"); zip(list, toClient); toClient.close(); outStream.close(); this.downloadFiles(fileZip, response, true); return null; } } public static void zip(List<Map<String, Object>> list, ZipOutputStream outputStream) throws IOException, ServletException { try { int size = list.size(); // 壓縮列表中的檔案 for (int i = 0; i < size; i++) { File file = (File) list.get(i).get("fileZip"); zips(file,outputStream); } } catch (IOException e) { throw e; } } public static void zips(File file, ZipOutputStream outputStream) throws IOException, ServletException { try { if (file.exists()) { if (file.isFile()) { FileInputStream inStream = new FileInputStream(file); BufferedInputStream bInStream = new BufferedInputStream(inStream); ZipEntry entrys = new ZipEntry(file.getName()); ZipEntry entry = new ZipEntry(entrys); outputStream.putNextEntry(entry); final int MAX_BYTE = 10 * 1024 * 1024; // 最大的流為10M long streamTotal = 0; // 接受流的容量 int streamNum = 0; // 流需要分開的數量 int leaveByte = 0; // 檔案剩下的字元數 byte[] inOutbyte; // byte陣列接受檔案的資料 streamTotal = bInStream.available(); // 通過available方法取得流的最大字元數 streamNum = (int) Math.floor(streamTotal / MAX_BYTE); // 取得流檔案需要分開的數量 leaveByte = (int) streamTotal % MAX_BYTE; // 分開檔案之後,剩餘的數量 if (streamNum > 0) { for (int j = 0; j < streamNum; ++j) { inOutbyte = new byte[MAX_BYTE]; // 讀入流,儲存在byte陣列 bInStream.read(inOutbyte, 0, MAX_BYTE); outputStream.write(inOutbyte, 0, MAX_BYTE); // 寫出流 } } // 寫出剩下的流資料 inOutbyte = new byte[leaveByte]; bInStream.read(inOutbyte, 0, leaveByte); outputStream.write(inOutbyte); outputStream.closeEntry(); // Closes the current ZIP entry // and positions the stream for // writing the next entry bInStream.close(); // 關閉 inStream.close(); } } else { throw new ServletException("檔案不存在!"); } } catch (IOException e) { throw e; } } public static void zipFiles(List<Map<String, Object>> files, ZipOutputStream outputStream, List<Map<String, Object>> name) throws IOException, ServletException { try { int size = files.size(); // 壓縮列表中的檔案 for (int i = 0; i < size; i++) { File file = (File) files.get(i).get("PATH"); String qbsname = name.get(i).get("name").toString(); String fspx = name.get(i).get("fspx").toString(); String fszh = name.get(i).get("fszh").toString(); zipFiles(file, outputStream, qbsname,fspx,fszh); } } catch (IOException e) { throw e; } } public static void zipFiles(File inputFile, ZipOutputStream outputstream, String qbsname,String fspx,String fszh) throws IOException, ServletException { try { if (inputFile.exists()) { if (inputFile.isFile()) { FileInputStream inStream = new FileInputStream(inputFile); BufferedInputStream bInStream = new BufferedInputStream(inStream); ZipEntry entrys = new ZipEntry(inputFile.getName()); String entry1 = entrys.toString(); entry1 = StringUtils.substringAfter(entry1,"."); String pathname = qbsname+"_"+fszh+"_("+ fspx+ ")."+entry1; ZipEntry entry = new ZipEntry(pathname); outputstream.putNextEntry(entry); final int MAX_BYTE = 10 * 1024 * 1024; // 最大的流為10M long streamTotal = 0; // 接受流的容量 int streamNum = 0; // 流需要分開的數量 int leaveByte = 0; // 檔案剩下的字元數 byte[] inOutbyte; // byte陣列接受檔案的資料 streamTotal = bInStream.available(); // 通過available方法取得流的最大字元數 streamNum = (int) Math.floor(streamTotal / MAX_BYTE); // 取得流檔案需要分開的數量 leaveByte = (int) streamTotal % MAX_BYTE; // 分開檔案之後,剩餘的數量 if (streamNum > 0) { for (int j = 0; j < streamNum; ++j) { inOutbyte = new byte[MAX_BYTE]; // 讀入流,儲存在byte陣列 bInStream.read(inOutbyte, 0, MAX_BYTE); outputstream.write(inOutbyte, 0, MAX_BYTE); // 寫出流 } } // 寫出剩下的流資料 inOutbyte = new byte[leaveByte]; bInStream.read(inOutbyte, 0, leaveByte); outputstream.write(inOutbyte); outputstream.closeEntry(); // Closes the current ZIP entry // and positions the stream for // writing the next entry bInStream.close(); // 關閉 inStream.close(); } } else { throw new ServletException("檔案不存在!"); } } catch (IOException e) { throw e; } } public void downloadFiles(File file,HttpServletResponse response,boolean isDelete) { try { // 以流的形式下載檔案。 BufferedInputStream fis = new BufferedInputStream(new FileInputStream(file.getPath())); byte[] buffer = new byte[fis.available()]; fis.read(buffer); fis.close(); // 清空response OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=" + new String(file.getName().getBytes("UTF-8"),"ISO-8859-1")); toClient.write(buffer); toClient.flush(); toClient.close(); if(isDelete) { file.delete(); //是否將生成的伺服器端檔案刪除 } } catch (IOException ex) { ex.printStackTrace(); } }