java瀏覽器文件打包下載過(guò)程解析
最近,在項(xiàng)目中遇到了需要將一系列的圖片打包下載的需求,借鑒了網(wǎng)上的一些通用方法,就順便分享出來(lái)實(shí)現(xiàn)的方法,不太記得借鑒的是哪位兄弟的博客了,總之萬(wàn)分感謝,進(jìn)入正題,實(shí)現(xiàn)打包下載的基本功能:
1.controller層代碼:
/** * 圖片壓縮打包 */ @RequestMapping(value = "/zipFile") public void compressionFile(HttpServletRequest request, HttpServletResponse response,String busiId) throws Exception{ //業(yè)務(wù)代碼,根據(jù)前臺(tái)傳來(lái)的ID查詢到資源表的圖片list SubMetaData subMetaData = subMetaDataService.findByBusiId(busiId); if (subMetaData != null) { List<SubMetaDataAtt> list = subMetaDataAttService.findByDataId(subMetaData.getDataId()); if (list.size() > 0){ subMetaDataAttService.downloadAllFile(request,response,list); } } }
2.service層通用的文件打包下載
/** * 將多個(gè)文件進(jìn)行壓縮打包,解決文件名下載后的亂碼問(wèn)題 * */ public void downloadAllFile(HttpServletRequest request, HttpServletResponse response, List<SubMetaDataAtt> list) throws UnsupportedEncodingException{ String downloadName = "附件圖片.zip"; String userAgent = request.getHeader("User-Agent"); // 針對(duì)IE或者以IE為內(nèi)核的瀏覽器: if (userAgent.contains("MSIE") || userAgent.contains("Trident")) { downloadName = java.net.URLEncoder.encode(downloadName, "UTF-8"); } else { // 非IE瀏覽器的處理: downloadName = new String(downloadName.getBytes("UTF-8"), "ISO-8859-1"); } //經(jīng)過(guò)上面的名稱處理即可解決文件名下載后亂碼的問(wèn)題 response.setContentType("multipart/form-data"); response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", downloadName)); //response.setHeader("Content-Disposition", "attachment;fileName=" + downloadName); OutputStream outputStream = null; ZipOutputStream zos = null; try { outputStream = response.getOutputStream(); zos = new ZipOutputStream(outputStream); // 將文件流寫入zip中,此方法在下面貼出 downloadTolocal(zos,list); } catch (IOException e) { logger.error("downloadAllFile-下載全部附件失敗",e); }finally { if(zos != null) { try { zos.close(); } catch (Exception e2) { logger.info("關(guān)閉輸入流時(shí)出現(xiàn)錯(cuò)誤",e2); } } if(outputStream != null) { try { outputStream.close(); } catch (Exception e2) { logger.info("關(guān)閉輸入流時(shí)出現(xiàn)錯(cuò)誤",e2); } } } }
將文件寫入zip中的方法:
private void downloadTolocal(ZipOutputStream zos, List<SubMetaDataAtt> list) throws IOException { //獲取文件信息//此處為業(yè)務(wù)代碼,可根據(jù)自己的需要替換,我在這里是將資源表list循環(huán)出取得路徑以及文件名,然后放進(jìn)ZipEntry中再執(zhí)行下載。 for (SubMetaDataAtt subMetaDataAtt : list) { String fileId = subMetaDataAtt.getAttId(); String fileName = subMetaDataAtt.getFileAlias()+subMetaDataAtt.getFileSuffixName(); String path = subMetaDataAtt.getFileAbsolutePath(); InputStream is = null; BufferedInputStream in = null; byte[] buffer = new byte[1024]; int len; //創(chuàng)建zip實(shí)體(一個(gè)文件對(duì)應(yīng)一個(gè)ZipEntry) ZipEntry entry = new ZipEntry(fileName); try { //獲取需要下載的文件流 File file= new File(path); if(file.exists()){ is = new FileInputStream(file); } in = new BufferedInputStream(is); zos.putNextEntry(entry); //文件流循環(huán)寫入ZipOutputStream while ((len = in.read(buffer)) != -1 ) { zos.write(buffer, 0, len); } } catch (Exception e) { logger.info("下載全部附件--壓縮文件出錯(cuò)",e); }finally { if(entry != null) { try { zos.closeEntry(); } catch (Exception e2) { logger.info("下載全部附件--zip實(shí)體關(guān)閉失敗",e2); } } if(in != null) { try { in.close(); } catch (Exception e2) { logger.info("下載全部附件--文件輸入流關(guān)閉失敗",e2); } } if(is != null) { try { is.close(); }catch (Exception e) { logger.info("下載全部附件--輸入緩沖流關(guān)閉失敗",e); } } } }
3.前臺(tái)js的請(qǐng)求方法:
注:文件的下載不要使用AJAX請(qǐng)求的方法,這樣是無(wú)法響應(yīng)請(qǐng)求的,一般會(huì)采用Window.open的方法。
window.open(context+"/sub/submetadataatt/zipFile?busiId="+downloadId);//這里的downloadId是我需要傳到后臺(tái)的變量。
總結(jié):關(guān)于上傳,下載的操作,實(shí)際上是要對(duì)于java的IO十分熟悉,才可以玩的轉(zhuǎn),大家一定要把握好基礎(chǔ)才可以在項(xiàng)目中游刃有余,不像我需要去借鑒他人的東西,大家一起努力,加油!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決使用mybatis取值,字段賦值錯(cuò)誤的問(wèn)題
這篇文章主要介紹了解決使用mybatis取值,字段賦值錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01selenium高效應(yīng)對(duì)Web頁(yè)面元素刷新的實(shí)例講解
今天小編就為大家分享一篇selenium高效應(yīng)對(duì)Web頁(yè)面元素刷新的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Idea配置maven-tomcat-plugin插件實(shí)現(xiàn)項(xiàng)目部署
今天小編就為大家分享一篇關(guān)于Idea配置maven-tomcat-plugin插件實(shí)現(xiàn)項(xiàng)目部署,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02Java處理圖片實(shí)現(xiàn)base64編碼轉(zhuǎn)換
這篇文章主要介紹了Java處理圖片實(shí)現(xiàn)base64編碼轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02IDEA報(bào)錯(cuò):java?找不到符號(hào)圖文解決過(guò)程
這篇文章主要給大家介紹了關(guān)于IDEA報(bào)錯(cuò):java?找不到符號(hào)解決的相關(guān)資料,運(yùn)行項(xiàng)目時(shí)Idea報(bào)錯(cuò),提示找不到符號(hào),但是這個(gè)類在項(xiàng)目里是存在的,網(wǎng)上找了很多文章都沒(méi)解決,浪費(fèi)了一個(gè)下午終于弄好了,記錄一下,需要的朋友可以參考下2023-08-08獲取Java線程轉(zhuǎn)儲(chǔ)的常用方法(推薦)
這篇文章主要介紹了獲取Java線程轉(zhuǎn)儲(chǔ)的常用方法,本文給大家介紹的非常想詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01spring mvc高級(jí)技術(shù)實(shí)例詳解
前面學(xué)習(xí)了簡(jiǎn)單的Spring Web知識(shí),接著學(xué)習(xí)更高階的Web技術(shù)。下面這篇文章主要給大家介紹了spring mvc高級(jí)技術(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起看看吧2018-09-09詳解Java使用Jsch與sftp服務(wù)器實(shí)現(xiàn)ssh免密登錄
這篇文章主要介紹了詳解Java使用Jsch與sftp服務(wù)器實(shí)現(xiàn)ssh免密登錄,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10