电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

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

引言

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

一、前端JS發送下載請求

1、ajax無法發送下載請求

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

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

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

<a href='http://localhost:8080/download/?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:UsersE480DesktopStudycasul筆記.txt'); paths.add('C:UsersE480DesktopStudyconfig配置中心筆記.txt'); paths.add('C:UsersE480DesktopStudyGateWay.txt'); if (paths.size() != 0) { // 創建臨時路徑,存放壓縮文件 String zipFilePath = 'D:workspace-IDEAzip我的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(); // 壓縮流不必關閉,使用完后再關}

三、結束

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

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

標簽: Java
相關文章:
主站蜘蛛池模板: 网优资讯-为循环资源、大宗商品、工业服务提供资讯与行情分析的数据服务平台 | 番茄畅听邀请码怎么输入 - Dianw8.com | 防水接头-电缆防水接头-金属-电缆密封接头-不锈钢电缆接头 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 首页_欧瑞传动官方网站--主营变频器、伺服系统、新能源、软起动器、PLC、HMI | 飞歌臭氧发生器厂家_水处理臭氧发生器_十大臭氧消毒机品牌 | 通辽信息港 - 免费发布房产、招聘、求职、二手、商铺等信息 www.tlxxg.net | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 消防泵-XBD单级卧式/立式消防泵-上海塑泉泵阀(集团)有限公司 | 离子色谱自动进样器-青岛艾力析实验科技有限公司 | 大_小鼠elisa试剂盒-植物_人Elisa试剂盒-PCR荧光定量试剂盒-上海一研生物科技有限公司 | 亚克隆,RNAi干扰检测,miRNA定量检测-上海基屹生物科技有限公司 | 流水线电子称-钰恒-上下限报警电子秤-上海宿衡实业有限公司 | 滚筒线,链板线,总装线,流水线-上海体能机电有限公司 | 电梯乘运质量测试仪_电梯安全评估测试仪-武汉懿之刻 | 仪器仪表网 - 永久免费的b2b电子商务平台| 高考志愿规划师_高考规划师_高考培训师_高报师_升学规划师_高考志愿规划师培训认证机构「向阳生涯」 | 氧化铁红厂家-淄博宗昂化工| 电竞馆加盟,沈阳网吧加盟费用选择嘉棋电竞_售后服务一体化 | 盘煤仪,盘料仪,盘点仪,堆料测量仪,便携式激光盘煤仪-中科航宇(北京)自动化工程技术有限公司 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 乐之康护 - 专业护工服务平台,提供医院陪护-居家照护-居家康复 | 广州迈驰新GMP兽药包装机首页_药品包装机_中药散剂包装机 | 成都LED显示屏丨室内户外全彩led屏厂家方案报价_四川诺显科技 | 体视显微镜_荧光生物显微镜_显微镜报价-微仪光电生命科学显微镜有限公司 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | ALC墙板_ALC轻质隔墙板_隔音防火墙板_轻质隔墙材料-湖北博悦佳 | 成都网站建设制作_高端网站设计公司「做网站送优化推广」 | 清管器,管道清管器,聚氨酯发泡球,清管球 - 承德嘉拓设备 | 膜片万向弹性联轴器-冲压铸造模具「沧州昌运模具」 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 铁盒_铁罐_马口铁盒_马口铁罐_铁盒生产厂家-广州博新制罐 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 江西自考网-江西自学考试网 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 纯水电导率测定仪-万用气体检测仪-低钠测定仪-米沃奇科技(北京)有限公司www.milwaukeeinst.cn 锂辉石检测仪器,水泥成分快速分析仪-湘潭宇科分析仪器有限公司 手术室净化装修-手术室净化工程公司-华锐手术室净化厂家 | RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 细砂提取机,隔膜板框泥浆污泥压滤机,螺旋洗砂机设备,轮式洗砂机械,机制砂,圆锥颚式反击式破碎机,振动筛,滚筒筛,喂料机- 上海重睿环保设备有限公司 |