Java多文件生成并壓縮下載功能(思路詳解)
年前一直忙著項(xiàng)目現(xiàn)場(chǎng)實(shí)施,沒時(shí)間整理,今天終于得空開始整理。
做WMS系統(tǒng)經(jīng)常會(huì)遇到導(dǎo)出各種類型的庫存單,此時(shí)就可以在后臺(tái)將這些整合壓縮到一個(gè)壓縮包內(nèi)然后再下載壓縮包,一個(gè)接口就可以完成的事。
有兩個(gè)思路:
思路一:將生成的多個(gè)文件先逐個(gè)存到本地一個(gè)臨時(shí)的文件夾內(nèi)并壓縮,獲取壓縮文件下載,下載完以后刪除該臨時(shí)文件夾和內(nèi)部文件 思路二:所有都在內(nèi)存中實(shí)現(xiàn),將生成的多個(gè)文件的輸出流轉(zhuǎn)換成為byte數(shù)組塞入壓縮包的輸出流中,最后下載該壓縮包
第一個(gè)思路雖然操作復(fù)雜,但是卻很容易想到的。
第二個(gè)思路,所有文件流都放在內(nèi)存中操作,操作大大的簡(jiǎn)便了。本文將要講述的就是此種方式。
controller層:
//思路二:所有都在內(nèi)存中實(shí)現(xiàn),將生成的多個(gè)文件的輸出流轉(zhuǎ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);
//將要壓縮的文件塞到一個(gè)list里面
List<Map> fileList = new ArrayList();
fileList.add(excelOut);
fileList.add(excelOut2);
//壓縮多個(gè)文件并下載
zipFiles(fileList,httpResponse);
}要養(yǎng)成一個(gè)良好的習(xí)慣,當(dāng)一個(gè)方法中的代碼量過于臃腫時(shí)候,要抽出來一部分生成一個(gè)新的方法來給調(diào)用。
//生成excel表格導(dǎo)出到本地
public Map exportExcel(String name) {
List<User> userList = userDao.queryUsersByName(name);
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
//使用easyExcel導(dǎo)出excel
String excelFileName = "根據(jù)人名查詢數(shù)據(jù).xlsx";
ExcelWriter writer = new ExcelWriter(out, ExcelTypeEnum.XLSX, true);
Sheet sheet = new Sheet(1, 0, User.class);
//設(shè)置自適應(yīng)寬度
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;
} //多個(gè)文件壓縮成壓縮包并下載
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 對(duì)象
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層就是簡(jiǎn)單的一個(gè)sql語句根據(jù)用戶名稱查詢用戶數(shù)據(jù)
如此便完成了多文件壓縮并下載的功能,如下。

當(dāng)然,思路一雖然復(fù)雜,但是對(duì)于新手同學(xué)我還是建議把思路一自己實(shí)現(xiàn)一下,其中對(duì)于文件IO的一些操作將會(huì)讓你更加容易理解并吸收。
到此這篇關(guān)于Java多文件生成并壓縮下載的文章就介紹到這了,更多相關(guān)Java多文件壓縮下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
OpenFeign服務(wù)接口調(diào)用的過程詳解
Feign是一個(gè)聲明式WebService客戶端。使用Feign能讓編寫Web?Service客戶端更加簡(jiǎn)單。它的使用方法是定義一個(gè)服務(wù)接口然后在上面添加注解,這篇文章主要介紹了OpenFeign服務(wù)接口調(diào)用,需要的朋友可以參考下2022-10-10
Java實(shí)現(xiàn)打飛機(jī)小游戲(附完整源碼)
這篇文章主要介紹了Java實(shí)現(xiàn)打飛機(jī)小游戲(附完整源碼),這里整理了詳細(xì)的代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
SpringBoot使用JavaMailSender實(shí)現(xiàn)發(fā)送郵件
JavaMailSender是Spring Framework中的一個(gè)接口,用于發(fā)送電子郵件,本文主要為大家詳細(xì)介紹了SpringBoot如何使用JavaMailSender實(shí)現(xiàn)發(fā)送郵件,需要的可以參考下2023-12-12
Java實(shí)現(xiàn)自動(dòng)獲取法定節(jié)假日詳細(xì)代碼
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)自動(dòng)獲取法定節(jié)假日的相關(guān)資料,獲取并處理節(jié)假日數(shù)據(jù)是一個(gè)常見需求,特別是在需要安排任務(wù)調(diào)度、假期通知等功能的場(chǎng)景中,需要的朋友可以參考下2024-05-05

