前后端分离项目后端向前端返回压缩包的方法实现java版
生活随笔
收集整理的這篇文章主要介紹了
前后端分离项目后端向前端返回压缩包的方法实现java版
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近公司的項目是讓前端有讓用戶下載zip壓縮包(里面都是圖片,圖片是保存在ftp上的)的任務,經過調研,將最終方案復制在下面:
//zip文件的下載@GetMapping("/zip/{imagePath}")@ResponseBodypublic void zip(HttpServletResponse response, @PathVariable(value = "imagePath", required = false) String imagePathList) throws IOException {String[] imagePaths = imagePathList.split(CCPCommon.CCP_SEPARATOR);//設置返回響應頭response.reset();// 自動判斷下載文件類型response.setContentType("multipart/form-data");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("picture.zip", "UTF-8"));FTPClient ftpClient;ftpClient = FtpUtil.getFTPClient("xxx", "xxx", "xxx", 21);// 中文支持ftpClient.setControlEncoding("UTF-8");ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);ftpClient.enterLocalPassiveMode();ftpClient.changeWorkingDirectory("ftp://xxx");ZipOutputStream zos = null;OutputStream os = response.getOutputStream();try {zos = new ZipOutputStream(os);InputStream ins = null;for (String imagePath : imagePaths) {if (imagePath == null || imagePath.equals("") || imagePath.equals("undefined")) {//如果書沒有上傳continue;}ins = ftpClient.retrieveFileStream(new String(imagePath.getBytes("UTF-8"), "iso-8859-1"));if (ins != null) {zos.putNextEntry(new ZipEntry(imagePath));int len;byte[] buff = new byte[1024];while (-1 != (len = ins.read(buff, 0, buff.length))) {zos.write(buff, 0, len);}zos.closeEntry();ins.close();ftpClient.completePendingCommand();//不讓一個循環后ftpClient自動關閉}}zos.flush();} catch (Exception e) {e.printStackTrace();} finally {if (zos != null) {try {zos.close();} catch (IOException e) {e.printStackTrace();}}}}這里很重要的操作:
//設置返回響應頭response.reset();// 自動判斷下載文件類型response.setContentType("multipart/form-data");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("picture.zip", "UTF-8"));一定要設置響應頭部的type,并且可以給這個壓縮包起一個名字。
還有就是ftp的一個細節:
如果不加這一行,ftp自動會關閉連接,一定要讓它保持連接狀態。
總結
以上是生活随笔為你收集整理的前后端分离项目后端向前端返回压缩包的方法实现java版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: n皇后问题java版
- 下一篇: vue实现接受后端传过来的zip数据,a