前端ajax請求+后端java實現(xiàn)的下載zip壓縮包功能示例
ajax請求 下載zip壓縮包
后臺最主要是 response.setContentType(“application/octet-stream”);
以及 response.addHeader(“Content-Disposition”, “attachment;fileName=” + URLEncoder.encode(“圖片.zip”, “UTF-8”));
一、后臺代碼
@PostMapping("/downloadZip") public void downloadCerts(HttpServletRequest request, HttpServletResponse response, @RequestBody List<String> ids) throws UnsupportedEncodingException { //文件流octet-stream response.setContentType("application/octet-stream"); response.setCharacterEncoding("utf-8"); response.addHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("圖片.zip", "UTF-8")); try { ZipOutputStream resultStream = new ZipOutputStream(response.getOutputStream()); // 這里是查詢數(shù)據(jù)庫 List<Map> result = service.downloadCerts(ids); byte[] buffer = new byte[10240]; for (Map map :result) { //因為數(shù)據(jù)庫保存的是圖片的base64 所以需要轉(zhuǎn)換 BASE64Decoder decoder = new BASE64Decoder(); File certFace = new File("temp.png"); OutputStream out = new FileOutputStream(certFace); byte[] b = decoder.decodeBuffer(((String) map.get("certB64")).split(",")[1]); for (int i = 0; i <b.length ; i++) { if (b[i] <0) { b[i]+=256; } } out.write(b); out.flush(); out.close(); //到這里 base64 轉(zhuǎn)換成了圖片 //往zip里面壓入第一個文件 本地文件 resultStream.putNextEntry(new ZipEntry("本地圖片.png" )); InputStream stream = new FileInputStream(new File("temp.png")); int len; // 讀入需要下載的文件的內(nèi)容,打包到zip文件 while ((len = stream.read(buffer)) > 0) { resultStream.write(buffer, 0, len); } resultStream.closeEntry(); stream.close(); resultStream.flush(); //第一個文件壓入完成 關(guān)閉流 刷新一下緩沖區(qū) // 往zip里面壓入第二個文件 網(wǎng)絡(luò)文件 例:https://profile.csdnimg.cn/8/C/E/3_blogdevteam resultStream.putNextEntry(new ZipEntry("網(wǎng)絡(luò)圖片.png")); URL url = new URL("https://profile.csdnimg.cn/8/C/E/3_blogdevteam";); String str = url.toString(); URLConnection connection = url.openConnection(); InputStream backStream = connection.getInputStream(); // 讀入需要下載的文件的內(nèi)容,打包到zip文件 while ((len = backStream.read(buffer)) > 0) { resultStream.write(buffer, 0, len); } resultStream.closeEntry(); backStream.close(); resultStream.flush(); //第二個文件壓入完成 關(guān)閉流 刷新一下緩沖區(qū) } resultStream.close(); //關(guān)閉流 } catch (IOException e) { e.printStackTrace(); } }
二、前端代碼
前端代碼比較簡單 直接貼出 我使用的是vue的 axios
download(this.ids).then((response) =>{ if (response.status == 200) { let url = window.URL.createObjectURL(new Blob([response.data])) let link= document.createElement('a') link.style.display='none' link.href=url link.setAttribute('download', "圖片.zip") // 自定義下載文件名(如exemple.txt) document.body.appendChild(link) link.click() }else{ this.$message.error("下載出錯了"); } });
這里的 download(this.ids) 是封裝過的axios 重點是 then里的代碼
問題
如果你發(fā)現(xiàn)下載的文件比源文件大,很可能是前端請求需要加入以下代碼
responseType:'blob',
注意:筆者在測試過程中發(fā)現(xiàn)一些網(wǎng)站帶有防盜鏈功能,需要referer驗證。另外還可能會出現(xiàn)前端blob格式轉(zhuǎn)換、跨域等諸多問題 ,需要讀者酌情處理。
相關(guān)文章
ajax實現(xiàn)從后臺拿數(shù)據(jù)顯示在HTML前端的方法
今天小編就為大家分享一篇ajax實現(xiàn)從后臺拿數(shù)據(jù)顯示在HTML前端的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08關(guān)于多個Ajax請求執(zhí)行返回先后的問題示例探討
這篇文章主要與大家探討下關(guān)于多個Ajax請求執(zhí)行返回先后的問題,需要的朋友可以參考下2014-07-07解決微信返回上一頁,頁面中的AJAX的請求,對Get請求無效的問題
這篇文章給大家介紹微信返回上一頁,頁面中的AJAX的請求,對Get請求無效的問題分析及解決方法,需要的朋友參考下2017-01-01有關(guān)Ajax中g(shù)et和post的使用問題
下面小編就為大家?guī)硪黄嘘P(guān)Ajax中g(shù)et和post的使用問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-06-06Ajax xmlHttpRequest的status的值的含義
雖然常寫ajax方面的東西,但是很少去專門了解xmlHttpRequest的status各個值的含義,今天在開發(fā)的過程中又遇到了問題,查過資料后,將他人已總結(jié)過的轉(zhuǎn)載一下,學(xué)習(xí)學(xué)習(xí)。2010-03-03Ajax Session失效跳轉(zhuǎn)登錄頁面的方法
這篇文章主要介紹了Ajax Session失效跳轉(zhuǎn)登錄頁面的方法,非常不錯具有參考借鑒價值,感興趣的朋友一起看下吧2016-06-06