Java多文件生成并壓縮下載功能(思路詳解)
年前一直忙著項目現(xiàn)場實施,沒時間整理,今天終于得空開始整理。
做WMS系統(tǒng)經(jīng)常會遇到導出各種類型的庫存單,此時就可以在后臺將這些整合壓縮到一個壓縮包內然后再下載壓縮包,一個接口就可以完成的事。
有兩個思路:
思路一:將生成的多個文件先逐個存到本地一個臨時的文件夾內并壓縮,獲取壓縮文件下載,下載完以后刪除該臨時文件夾和內部文件 思路二:所有都在內存中實現(xiàn),將生成的多個文件的輸出流轉換成為byte數(shù)組塞入壓縮包的輸出流中,最后下載該壓縮包
第一個思路雖然操作復雜,但是卻很容易想到的。
第二個思路,所有文件流都放在內存中操作,操作大大的簡便了。本文將要講述的就是此種方式。
controller層:
//思路二:所有都在內存中實現(xiàn),將生成的多個文件的輸出流轉換成為byte數(shù)組塞入壓縮包的輸出流中,最后下載該壓縮包 @RequestMapping("/zip/download2") public void downloadZip2(String name, HttpServletResponse httpResponse) { documentService.downloadReport(name, httpResponse); }
service層:
public void downloadReport(String name, HttpServletResponse httpResponse){ //使用EasyExcel生成excel表1 Map excelOut = exportExcel(name); //使用EasyExcel生成excel表2(同上) Map excelOut2 = exportExcel2(name); //將要壓縮的文件塞到一個list里面 List<Map> fileList = new ArrayList(); fileList.add(excelOut); fileList.add(excelOut2); //壓縮多個文件并下載 zipFiles(fileList,httpResponse); }
要養(yǎng)成一個良好的習慣,當一個方法中的代碼量過于臃腫時候,要抽出來一部分生成一個新的方法來給調用。
//生成excel表格導出到本地 public Map exportExcel(String name) { List<User> userList = userDao.queryUsersByName(name); try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { //使用easyExcel導出excel String excelFileName = "根據(jù)人名查詢數(shù)據(jù).xlsx"; ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true); Sheet sheet = new Sheet(1, 0, User.class); //設置自適應寬度 sheet.setAutoWidth(Boolean.TRUE); writer.write(userList, sheet); writer.finish(); Map excelOut = new HashMap(); excelOut.put("fileName",excelFileName); excelOut.put("outByte",out.toByteArray()); return excelOut; } catch (Exception e) { log.error(e.getMessage(), e); } return null; }
//多個文件壓縮成壓縮包并下載 public void zipFiles(List<Map> fileList,HttpServletResponse httpResponse) { try(ZipOutputStream zipOutputStream = new ZipOutputStream(httpResponse.getOutputStream()); OutputStream out =null) { //下載壓縮包 httpResponse.setContentType("application/zip"); httpResponse.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("附件.zip", "UTF-8")); // 創(chuàng)建 ZipEntry 對象 for (Map map:fileList){ ZipEntry zipEntry = new ZipEntry((String) map.get("fileName")); zipOutputStream.putNextEntry(zipEntry); zipOutputStream.write((byte[]) map.get("outByte")); } } catch (IOException e) { log.error(e.getMessage(), e); } }
dao層就是簡單的一個sql語句根據(jù)用戶名稱查詢用戶數(shù)據(jù)
如此便完成了多文件壓縮并下載的功能,如下。
當然,思路一雖然復雜,但是對于新手同學我還是建議把思路一自己實現(xiàn)一下,其中對于文件IO的一些操作將會讓你更加容易理解并吸收。
到此這篇關于Java多文件生成并壓縮下載的文章就介紹到這了,更多相關Java多文件壓縮下載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Spring+SpringMVC+Hibernate整合實例講解
在本篇文章里小編給大家整理的是關于Spring+SpringMVC+Hibernate整合實例講解,需要的朋友們可以學習下。2020-03-03JVM調優(yōu)OutOfMemoryError異常分析
這篇文章主要為大家介紹了JVM調優(yōu)OutOfMemoryError異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11