欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年11月12日 08:36:29   作者:LuckyWangxs  
這篇文章主要介紹了Java實(shí)現(xiàn)批量下載(打包成zip)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

引言

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

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

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

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

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

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

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

批量下載,前端可以傳每條數(shù)據(jù)的id,用逗號拼接成字符串,后臺(tái)接收后進(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ù),也就是說用此方式提交,后臺(tái)不能用@RequestBody注解

$('.download-btn').click(function () {
 // 如果要傳選中行的id,則從頁面獲取到所有id,可以拿逗號拼接,放到輸入框傳給后臺(tái)
 // 如果需要把選中行整行數(shù)據(jù)傳到后臺(tái),form表單不支持傳json格式數(shù)據(jù),所以可以把
 // 選中行數(shù)據(jù)放入數(shù)組,轉(zhuǎn)為json放入輸入框,后臺(tái)用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);
 //提交表單,實(shí)現(xiàn)下載
 $dataForm.submit();
});

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

二、后臺(tái)處理

        此處省略接收參數(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:\\Users\\E480\\Desktop\\Study\\casul筆記.txt");
 paths.add("C:\\Users\\E480\\Desktop\\Study\\config配置中心筆記.txt");
 paths.add("C:\\Users\\E480\\Desktop\\Study\\GateWay.txt");
 if (paths.size() != 0) {
 // 創(chuàng)建臨時(shí)路徑,存放壓縮文件
 String zipFilePath = "D:\\workspace-IDEA\\zip\\我的zip.zip";
 // 壓縮輸出流,包裝流,將臨時(shí)文件輸出流包裝成壓縮流,將所有文件輸出到這里,打成zip包
 ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath));
 // 循環(huán)調(diào)用壓縮文件方法,將一個(gè)一個(gè)需要下載的文件打入壓縮文件包
 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);

 //該流不可以手動(dòng)關(guān)閉,手動(dòng)關(guān)閉下載會(huì)出問題,下載完成后會(huì)自動(dòng)關(guān)閉
 ServletOutputStream outputStream = response.getOutputStream();
 FileInputStream inputStream = new FileInputStream(zipFilePath);
 // 如果是SpringBoot框架,在這個(gè)路徑
 // org.apache.tomcat.util.http.fileupload.IOUtils產(chǎn)品
 // 否則需要自主引入apache的 commons-io依賴
 // copy方法為文件復(fù)制,在這里直接實(shí)現(xiàn)了下載效果
 IOUtils.copy(inputStream, outputStream);

 // 關(guān)閉輸入流
 inputStream.close();

 //下載完成之后,刪掉這個(gè)zip包
 File fileTempZip = new File(zipFilePath);
 fileTempZip.delete();
 }
}

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

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)前文件作為一個(gè)zip實(shí)體寫入壓縮流,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ī)操作,沒有彎彎繞繞,只是在實(shí)現(xiàn)完整功能的過程中踩到了一些坑,在此記錄一下,以便加深印象和幫助他人吧~~

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

相關(guān)文章

  • Java通過經(jīng)緯度坐標(biāo)獲取兩個(gè)點(diǎn)之間的直線距離的示例

    Java通過經(jīng)緯度坐標(biāo)獲取兩個(gè)點(diǎn)之間的直線距離的示例

    這篇文章主要介紹了Java通過經(jīng)緯度坐標(biāo)獲取兩個(gè)點(diǎn)之間的直線距離的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java異常處理之try...catch...finally詳解

    Java異常處理之try...catch...finally詳解

    今天小編就為大家分享一篇關(guān)于Java異常處理之try...catch...finally詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java中Console對象實(shí)例代碼

    Java中Console對象實(shí)例代碼

    這篇文章主要介紹了Java中Console對象實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • AQS加鎖機(jī)制Synchronized相似點(diǎn)詳解

    AQS加鎖機(jī)制Synchronized相似點(diǎn)詳解

    這篇文章主要為大家介紹了AQS加鎖機(jī)制Synchronized相似點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 談?wù)凧ava中整數(shù)類型(short int long)的存儲(chǔ)方式

    談?wù)凧ava中整數(shù)類型(short int long)的存儲(chǔ)方式

    在java中的整數(shù)類型有四種,分別是byte short in long,本文重點(diǎn)給大家介紹java中的整數(shù)類型(short int long),由于byte只是一個(gè)字節(jié)0或1,在此就不多說了,對java中的整數(shù)類型感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • @ComponentScan在spring中無效的原因分析及解決方案

    @ComponentScan在spring中無效的原因分析及解決方案

    這篇文章主要介紹了@ComponentScan在spring中無效的原因分析及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 解決ObjectMapper.convertValue() 遇到的一些問題

    解決ObjectMapper.convertValue() 遇到的一些問題

    這篇文章主要介紹了解決ObjectMapper.convertValue() 遇到的一些問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • MyBatis使用接口映射的方法步驟

    MyBatis使用接口映射的方法步驟

    映射器是MyBatis中最核心的組件之一,本文主要介紹了MyBatis使用接口映射的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • 詳解Spring AOP 實(shí)現(xiàn)“切面式”valid校驗(yàn)

    詳解Spring AOP 實(shí)現(xiàn)“切面式”valid校驗(yàn)

    本篇文章主要介紹了詳解Spring AOP 實(shí)現(xiàn)“切面式”valid校驗(yàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • 詳解Mybatis模板(已優(yōu)化)適合小白

    詳解Mybatis模板(已優(yōu)化)適合小白

    這篇文章主要介紹了Mybatis模板(已優(yōu)化)適合小白,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評論