国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Java實現(xiàn)批量下載(打包成zip)的實現(xiàn)

瀏覽:6日期:2022-08-21 10:52:37

引言

批量下載思路,首先前端發(fā)送下載請求,攜帶必要參數(shù),也可無參默認(rèn)批量下載頁面全部數(shù)據(jù);后臺接收后進(jìn)行數(shù)據(jù)處理拿到要下載文件的下載地址,循環(huán)下載地址,用壓縮流,將文件直接寫入壓縮包,最后利用文件下載將壓縮包輸出給前端。

一、前端JS發(fā)送下載請求

1、ajax無法發(fā)送下載請求

關(guān)于下載的常見需求無非就是點擊按鈕下載或者選中點擊批量下載,點擊下載或批量下載后,攜帶參數(shù)向后臺發(fā)送下載請求,但是JS中的ajax無法觸發(fā)瀏覽器的下載機制,這也是處于安全考慮,所以下載請求不可以通過發(fā)送ajax請求實現(xiàn)。

2、js發(fā)送下載請求:超鏈接方式

我們可以通過< a >標(biāo)簽實現(xiàn),在a標(biāo)簽的href中拼接get請求并攜帶所需參數(shù),如下

<a href='http://localhost:8080/download/?ids=123,234&fileName=down'>下載</a>

批量下載,前端可以傳每條數(shù)據(jù)的id,用逗號拼接成字符串,后臺接收后進(jìn)行數(shù)據(jù)處理,然后進(jìn)行批量下載,但是此方式有局限性,如果我選中了很多條數(shù)據(jù),每條數(shù)據(jù)的id都是32位UUID,那get請求無法攜帶大量參數(shù),所以這種方式并不適合批量下載,只適合單條數(shù)據(jù)下載。

3、js發(fā)送下載請求:拼接Form表單,并提交

form表單也有局限性,例如form表單不能傳輸json格式的數(shù)據(jù),也就是說用此方式提交,后臺不能用@RequestBody注解

$(’.download-btn’).click(function () { // 如果要傳選中行的id,則從頁面獲取到所有id,可以拿逗號拼接,放到輸入框傳給后臺 // 如果需要把選中行整行數(shù)據(jù)傳到后臺,form表單不支持傳json格式數(shù)據(jù),所以可以把 // 選中行數(shù)據(jù)放入數(shù)組,轉(zhuǎn)為json放入輸入框,后臺用String接收,然后再轉(zhuǎn)回Obj var $dataForm = $( '<form type=’hidden’ method=’post’>' + '<input type=’hidden’ id=’ids’ name=’ids’ value=’' + ids + '’ type=’text’/>' + '</form>' ); $dataForm.attr('action', ’localhost:8080/download’); $(document.body).append($dataForm); //提交表單,實現(xiàn)下載 $dataForm.submit();});

如上邊代碼所示,傳參為ids,那如果你想傳obj,可以用JSON.stringify()將前端對象或數(shù)組類型轉(zhuǎn)為json字符串,然后賦值給表單的輸入框,一并提交給后臺,后臺用String接收,然后再轉(zhuǎn)回Object,我在測試過程中 js提交數(shù)據(jù)到后臺(json),' 被轉(zhuǎn)譯 成了& quot;,如果你也遇到,請看這篇文章:文章鏈接

二、后臺處理

此處省略接收參數(shù),獲取需要下載的文件的url,直接寫死模擬:

@RequestMapping(value = '/download', method = RequestMethod.POST)public void plistDownLoad(HttpServletResponse response) throws Exception { // 此處模擬處理ids,拿到文件下載url List<String> paths = new ArrayList<>(); paths.add('C:UsersE480DesktopStudycasul筆記.txt'); paths.add('C:UsersE480DesktopStudyconfig配置中心筆記.txt'); paths.add('C:UsersE480DesktopStudyGateWay.txt'); if (paths.size() != 0) { // 創(chuàng)建臨時路徑,存放壓縮文件 String zipFilePath = 'D:workspace-IDEAzip我的zip.zip'; // 壓縮輸出流,包裝流,將臨時文件輸出流包裝成壓縮流,將所有文件輸出到這里,打成zip包 ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath)); // 循環(huán)調(diào)用壓縮文件方法,將一個一個需要下載的文件打入壓縮文件包 for (String path : paths) { // 該方法在下面定義 fileToZip(path, zipOut); } // 壓縮完成后,關(guān)閉壓縮流 zipOut.close(); //拼接下載默認(rèn)名稱并轉(zhuǎn)為ISO-8859-1格式 String fileName = new String(('我的壓縮文件.zip').getBytes(),'ISO-8859-1'); response.setHeader('Content-Disposition', 'attchment;filename='+fileName); //該流不可以手動關(guān)閉,手動關(guān)閉下載會出問題,下載完成后會自動關(guān)閉 ServletOutputStream outputStream = response.getOutputStream(); FileInputStream inputStream = new FileInputStream(zipFilePath); // 如果是SpringBoot框架,在這個路徑 // org.apache.tomcat.util.http.fileupload.IOUtils產(chǎn)品 // 否則需要自主引入apache的 commons-io依賴 // copy方法為文件復(fù)制,在這里直接實現(xiàn)了下載效果 IOUtils.copy(inputStream, outputStream); // 關(guān)閉輸入流 inputStream.close(); //下載完成之后,刪掉這個zip包 File fileTempZip = new File(zipFilePath); fileTempZip.delete(); }}

將文件打包的方法,需要傳一個壓縮路徑,和一個文件,一次只將一個文件寫入壓縮包

public static void fileToZip(String filePath,ZipOutputStream zipOut) throws IOException { // 需要壓縮的文件 File file = new File(filePath); // 獲取文件名稱,如果有特殊命名需求,可以將參數(shù)列表拓展,傳fileName String fileName = file.getName(); FileInputStream fileInput = new FileInputStream(filePath); // 緩沖 byte[] bufferArea = new byte[1024 * 10]; BufferedInputStream bufferStream = new BufferedInputStream(fileInput, 1024 * 10); // 將當(dāng)前文件作為一個zip實體寫入壓縮流,fileName代表壓縮文件中的文件名稱 zipOut.putNextEntry(new ZipEntry(fileName)); int length = 0; // 最常規(guī)IO操作,不必緊張 while ((length = bufferStream.read(bufferArea, 0, 1024 * 10)) != -1) { zipOut.write(bufferArea, 0, length); } //關(guān)閉流 fileInput.close(); // 需要注意的是緩沖流必須要關(guān)閉流,否則輸出無效 bufferStream.close(); // 壓縮流不必關(guān)閉,使用完后再關(guān)}

三、結(jié)束

我也是第一次接觸批量下載,它本身并不難,都只是一些IO的常規(guī)操作,沒有彎彎繞繞,只是在實現(xiàn)完整功能的過程中踩到了一些坑,在此記錄一下,以便加深印象和幫助他人吧~~

到此這篇關(guān)于Java實現(xiàn)批量下載(打包成zip)的實現(xiàn)的文章就介紹到這了,更多相關(guān)Java 批量下載 內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 亚洲欧美成人网 | 99久久国内精品成人免费 | 岛国片欧美一级毛片 | 在线精品日韩一区二区三区 | 亚洲一区二区三区不卡在线播放 | 国产一区二区精品 | 国产精品毛片一区 | 成人免费xxx色视频 成人免费大片a毛片 | 波多野结衣视频在线观看地址免费 | 爽爽日本在线视频免费 | 国产亚洲精品一区二区三区 | 国产精品久久久久久久久免费观看 | 一本色道久久综合网 | 亚洲怡红院在线 | 亚欧成人毛片一区二区三区四区 | 免费一级毛片在线播放欧美 | 国产亚洲片 | 国产五区 | 日本免费一区视频 | 在线播放国产一区二区三区 | 国产毛片在线高清视频 | 欧美一级片手机在线观看 | 久久久久久久久影院 | 久久橹 | 欧美巨大video粗暴 | 久久久午夜精品理论片 | 亚洲一区二区在线视频 | 中文字幕一区二区三区视频在线 | 波多野结衣免费观看视频 | 国产在线观看网址在线视频 | 女女互操 | 欧美日韩精品一区二区在线线 | 欧美午夜三级我不卡在线观看 | 男女男精品视频在线播放 | 欧美三区在线 | 精品久久免费观看 | 欧美高h视频 | 国产亚洲高清在线精品99 | 成人韩免费网站 | 国产v综合v亚洲欧美大另类 | 国产伦理自拍 |