91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Java如何實現批量下載

發布時間:2020-11-16 15:55:35 來源:億速云 閱讀:289 作者:Leah 欄目:開發技術

這篇文章給大家介紹使用Java如何實現批量下載,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

引言

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

一、前端JS發送下載請求

1、ajax無法發送下載請求

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

2、js發送下載請求:超鏈接方式

        我們可以通過< a >標簽實現,在a標簽的href中拼接get請求并攜帶所需參數,如下

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

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

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

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

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

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

二、后臺處理

        此處省略接收參數,獲取需要下載的文件的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) {
 // 創建臨時路徑,存放壓縮文件
 String zipFilePath = "D:\\workspace-IDEA\\zip\\我的zip.zip";
 // 壓縮輸出流,包裝流,將臨時文件輸出流包裝成壓縮流,將所有文件輸出到這里,打成zip包
 ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFilePath));
 // 循環調用壓縮文件方法,將一個一個需要下載的文件打入壓縮文件包
 for (String path : paths) {
  // 該方法在下面定義
  fileToZip(path, zipOut);
 }
 // 壓縮完成后,關閉壓縮流
 zipOut.close();

 //拼接下載默認名稱并轉為ISO-8859-1格式
 String fileName = new String(("我的壓縮文件.zip").getBytes(),"ISO-8859-1");
 response.setHeader("Content-Disposition", "attchment;filename="+fileName);

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

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

關于使用Java如何實現批量下載就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洛川县| 八宿县| 许昌县| 凌源市| 榆树市| 崇礼县| 祁连县| 波密县| 梓潼县| 淮安市| 柞水县| 安庆市| 达孜县| 临猗县| 原阳县| 华蓥市| 察哈| 翁牛特旗| 池州市| 芦山县| 双桥区| 沿河| 河西区| 常山县| 赣州市| 壤塘县| 全州县| 永修县| 二连浩特市| 东城区| 永宁县| 九龙县| 长寿区| 五大连池市| 古田县| 辉县市| 石林| 唐河县| 宁河县| 陆川县| 大埔区|