一.背景说明

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

二.实现思路

  主要的实现思路:创建文件夹->文件夹中创建需要下载的文件->压缩文件夹->下载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. Flutter学习(7)——网络请求框架Dio简单使用

    原文地址: Flutter学习(7)--网络请求框架Dio简单使用 | Stars-One的杂货小窝 Flutter系列学习之前都是在个人博客发布,感兴趣可以过去看看 网络请求一般APP都是需要的,在 ...

  2. Netty入门(三):EventLoop

    前言 Netty系列索引: 1.Netty入门(一):ByteBuf 2.Netty入门(二):Channel IO相关: 1.Java基础(一):I/O多路复用模型及Linux中的应用 上文提到,早 ...

  3. C++面向对象 1(类-封装)

    1 //类和对象 2 //C++ 面向对象 三大特性 : 封装 继承 多态 3 4 //设计一个圆类,求圆的周长 5 //圆周长 = 2*PI * 半径 6 7 #include <iostre ...

  4. Git(6)-- 记录每次更新到仓库(git clone、status、add、diff、commit、rm、mv命令详解)

    @ 目录 1.克隆现有仓库:git clone 2.检查当前文件状态 :git status 3.跟踪新文件:git add 4.暂存已修改的文件:git add 5.状态简览: git status ...

  5. 遗传算法Genetic Algorithm

    遗传算法Genetic Algorithm 好家伙,回回都是这个点,再这样下去人估计没了,换个bgm<夜泊秦淮>,要是经典咏流传能投票选诗词,投票选歌,俺一定选这个 开始瞎叨叨 遗传算法的 ...

  6. eclipse中添加进新的java项目中文乱码

    eclipse中添加进新的java项目中文乱码 添加学习的一些项目进eclipse中,结果其中的中文注释都变成了乱码 右击项目,点最下面的属性,出来新得弹框 在文本文件编码部分可以发现是GBK格式,选 ...

  7. STM32—位带操作

    STM32中的位带操作: 名字为位带操作,实际上是对位的操作,位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见. 51 单片机中通过关键字 sbit 来实现位定义, STM32 ...

  8. 一款优秀的国产性能测试工具kylinPET在麒麟操作系统上的能力表现

    一直以来人们从事性能测试,使用最多的是Jmeter和LoadRuner .笔者在网上找了一下国产性能测试工具,从中筛选出一款优秀的国产的性能测试工具kylinPET.查找该款工具的历史,好像有十年历史 ...

  9. 被MySQL慢日志查询搞废了?3分钟教你快速定位慢查询问题!

    一条慢查询会造成什么后果?刚开始使用MySQL的开发.初级DBA 以为就是简单的查询变慢些,体验稍微有一丢丢影响,殊不知,慢查询的破坏力远不止如此.业务高峰期,这头SQL还没处理完,大量新的查询请求堆 ...

  10. DOS创建/删除/描述 windows服务

    1.以管理员运行cmd ,输入 sc create test binPath= 程序路径\xxx.exe,主要 "="后面必须要空格 在服务里面查看结果 2.设置服务格式: sc ...