一.背景说明

  这篇文章讲述的是批量下载附件,在上一篇文章中,介绍了下载单个附件(上一篇文章)。

二.实现思路

  主要的实现思路:创建文件夹->文件夹中创建需要下载的文件->压缩文件夹->下载zip->删除文件夹

三.代码

1.html

    /*
* 批量下载附件
*/
$("#merchantApproval-annes-center-tb .batchDownloadButton").click(function(){
//获取附件列表的所有记录
var rows = $("#merchantApproval-annes-center-dg").datagrid("getRows");
//如果记录不为空
if(rows.length>0){
var imgList = "";
var imgName = "";
//遍历记录,获取图片地址列表和图片名称列表,以“|”隔开
$.each(rows,function(index,obj){
imgList = imgList + obj.annUrl + "|";
imgName = imgName + obj.annName + "|";
});
//临时构造一个form表单,用来发送post请求
//如果直接发送get请求,可能因为url过长导致失败,所以就需要发送post请求
var rootDiv = $("#merchantApproval-annes");
rootDiv.append("<form id='batchDownloadForm' method='post' action='${ctx}/approvalImageHandle.do?method=batchDownload'>"
+"<input name='imgList' value="+ imgList +">"
+"<input name='imgName' value="+ imgName +">"
+"</form>");
//发送完请求后,删除掉这个临时的form
$("#batchDownloadForm").submit().remove();
}else{
//提示用户
showTip("没有可以下载的数据!");
}
});

2.Controller

   /**
* 批量下载附件<br/>
* 主要的实现思路:创建文件夹->文件夹中创建需要下载的文件->压缩文件夹->下载zip->删除文件夹
* @param request
* @param response
* @throws Exception
*/
@RequestMapping(params = "method=batchDownload")
public void batchDownload(HttpServletRequest request, HttpServletResponse response) throws Exception{
//图片资源地址
String _imgList = request.getParameter("imgList");
//图片名称
String _imgName = request.getParameter("imgName");
//图片资源地址列表
String[] imgUrlList = _imgList.split("\\|");
//图片名称列表
String[] imgNameList = _imgName.split("\\|");
//媒体服务器的地址
String imgShowUrl = (String)request.getSession().getAttribute("imgShowUrl");
//创建文件夹
//request.getRealPath()方法使用request.getSession().getServletContext().getRealPath()代替
File fileDir = new File(request.getSession().getServletContext().getRealPath("/") + "/batchDownload");
if(!fileDir.exists()){
fileDir.mkdir();
}
/*
* 在batchDownload文件夹下创建每个文件
*/
for(int i = 0; i < imgUrlList.length; i++){
//图片资源地址列表加上imgShowUrl构成完整的url地址
imgUrlList[i] = imgShowUrl + "/" + imgUrlList[i];
URL url = new URL(imgUrlList[i]);
HttpURLConnection httpURL = (HttpURLConnection)url.openConnection();
//设置网络连接超时时间
httpURL.setConnectTimeout(5000);
//设置应用程序要从网络连接读取数据
httpURL.setDoInput(true);
httpURL.setRequestMethod("GET");
int responseCode = httpURL.getResponseCode();
if(responseCode == 200){
//如果响应为“200”,表示成功响应,则返回一个输入流
InputStream inputStream = httpURL.getInputStream();
//文件输出流,创建文件
FileOutputStream outputStream = new FileOutputStream(fileDir.getPath() + "\\" + (i+1) + "_" + imgNameList[i]);
byte[] data = new byte[1024];
int len = 0;
while((len = inputStream.read(data)) > 0){
outputStream.write(data, 0, len);
}
outputStream.close();
inputStream.close();
}
}
/*
* 文件创建完毕后压缩文件夹为zip
*/
Date date = new Date();
response.setContentType("application/octet-stream");
response.setHeader("content-disposition", "attachment;filename="+ "batchDownload" +date.getTime()+".zip");
//创建压缩文件输出流
ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());
//获取文件列表
File[] files = fileDir.listFiles();
for(int i = 0; i < files.length; i++){
File f = files[i];
zos.putNextEntry(new ZipEntry(f.getName()));
FileInputStream fis = new FileInputStream(f);
byte[] bs = new byte[1024];
int len = 0;
while((len = fis.read(bs)) > 0){
zos.write(bs, 0, len);
}
fis.close();
}
zos.flush();
zos.close();
/*
* 文件压缩完毕后删除创建的文件夹
*/
if(fileDir.exists()){
for(int i = 0; i< files.length; i++){
files[i].delete();
}
}
}

通过HttpURLConnection下载图片到本地--批量下载的更多相关文章

  1. 通过HttpURLConnection下载图片到本地--下载附件

    一.背景说明 现在我做的系统中,需要有一个下载附件的功能,其实就是下载图片到本地中.相应的图片保存在多媒体系统中,我们只能拿到它的资源地址(url),而不是真实的文件. 这里记录的是下载单个图片.下篇 ...

  2. php下载图片到本地

    写了一天,就写了这么点代码,凑合用吧. #saveImage.php<?php /** * 图片下载方法,提供两种图片保存方式: * 1.按照图片自带的名称保存 * 2.按照自定义文件名保存 * ...

  3. 通过scrapy内置的ImagePipeline下载图片到本地、并提取本地保存地址

    1.通过scrapy内置的ImagePipeline下载图片到本地 2.获取图片保存本地的地址 1.通过scrapy内置的ImagePipeline下载图片到本地 1)在settings.py中打开  ...

  4. scrapy中的ImagePipeline下载图片到本地、并提取本地的保存地址

    通过scrapy内置到ImagePipeline下载图片到本地 在settings中打开 ITEM_PIPELINES的注释,并在这里面加入 'scrapy.pipelines.images.Imag ...

  5. Lrc歌词批量下载助手 MP3歌词批量下载助手

    Lrc歌词批量下载助手  MP3歌词批量下载助手   易歌词的服务器已经挂掉,各个主流播放器已不提供明确的下载Lrc服务,当上G的MP3文件遇上苦逼的播放器,二缺就诞生了!本软件就是在这种背景下诞生的 ...

  6. 利用Node 搭配uglify-js压缩js文件,批量下载图片到本地

    Node的便民技巧-- 压缩代码 下载图片 压缩代码 相信很多前端的同学都会在上线前压缩JS代码,现在的Gulp Webpack Grunt......都能轻松实现.但问题来了,这些都不会,难道就要面 ...

  7. nodejs下载图片到本地,根据百度图片查找相应的图片,通过nodejs保存到本地文件夹

    根据百度图片查找相应的图片:输入图片关键字,输入图片数量(默认是30条),通过nodejs将批量保存图片到本地文件夹. 代码已上传到github上:代码github的地址 下载后进去back-end: ...

  8. 利用node来下载图片到本地

      本文是针对于知道图片地址的下载图片方法. 同时也是我的处男作(额,怪怪的〜);不要在意这些细节. 最近在弄项目迁移,需要把http的链接全换成https的:以前的cms不支持http的协议,然后就 ...

  9. URL地址下载图片到本地

    package test.dao; import eh.base.dao.DoctorDAO; import eh.entity.base.Doctor; import junit.framework ...

随机推荐

  1. 分布式事务最终一致性-CAP框架轻松搞定

    前言 对于分布式事务,常用的解决方案根据一致性的程度可以进行如下划分: 强一致性(2PC.3PC):数据库层面的实现,通过锁定资源,牺牲可用性,保证数据的强一致性,效率相对比较低. 弱一致性(TCC) ...

  2. BUUCTF[强网杯 2019]随便注(堆叠注入)

    记一道堆叠注入的题.也是刷BUU的第一道题. ?inject=1' 报错 ?inject=1'--+ //正常 存在注入的.正常查询字段数,字段数为2.在联合查询的时候给了新提示 ?inject=0' ...

  3. 智能合约审计-不安全的delegatecall

    简介 当合约A以delegatecall方式调用时, 相当于将外部合约B的func()代码复制过来 (其函数中涉及的变量或函数都需要在本地存在), 在合约A上下文空间中执行. 合约 pragma so ...

  4. Android音视频开发(1):H264 基本原理

    前言 H264 视频压缩算法现在无疑是所有视频压缩技术中使用最广泛,最流行的.随着 x264/openh264 以及 ffmpeg 等开源库的推出,大多数使用者无需再对H264的细节做过多的研究,这大 ...

  5. 以TiDB热点问题来谈Region的调度流程

    什么是热点问题 说这个话题之前我们先回顾一下TiDB的主要结构和概念. TiDB的核心架构分为TiDB.TiKV.PD三个部分,其中TiKV是一个分布式数据存储引擎用来存储真实的数据,在TiKV中又对 ...

  6. 【Unity3D】Android App Bundle(aab)打包上架Google Play介绍

    总体说来,Android App Bundle打包有3种方式,每种方式都有成功上架Google Play进行测试通过,因此实用程度还是挺高的.能够理解以下内容的前提是会打apk包,知道如何生成Asse ...

  7. mybatis中Oracle及mysql插入时自动生成主键以及返回主键

    mysql的方式: 方式一: useGeneratedKeys="true" keyProperty="id" 方式二: <selectKey keyPr ...

  8. MySQL:JDBC批量插入数据的效率

    平时使用mysql插入.查询数据都没有注意过效率,今天在for循环中使用JDBC插入1000条数据居然等待了一会儿 就来探索一下JDBC的批量插入语句对效率的提高 首先进行建表 create tabl ...

  9. 剖析虚幻渲染体系(10)- RHI

    目录 10.1 本篇概述 10.2 RHI基础 10.2.1 FRenderResource 10.2.2 FRHIResource 10.2.3 FRHICommand 10.2.4 FRHICom ...

  10. 【笔记】KNN之分类准确度

    分类准确度 分类准确度 以sklearn中的手写数字datasets.load_digits为例,其是8*8的图形,具有64个特征值,类别由0到9 我们挑选出666这个图形,将其可视化 X = dig ...