通过HttpURLConnection下载图片到本地--批量下载
一.背景说明
这篇文章讲述的是批量下载附件,在上一篇文章中,介绍了下载单个附件(上一篇文章)。
二.实现思路
主要的实现思路:创建文件夹->文件夹中创建需要下载的文件->压缩文件夹->下载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下载图片到本地--批量下载的更多相关文章
- 通过HttpURLConnection下载图片到本地--下载附件
一.背景说明 现在我做的系统中,需要有一个下载附件的功能,其实就是下载图片到本地中.相应的图片保存在多媒体系统中,我们只能拿到它的资源地址(url),而不是真实的文件. 这里记录的是下载单个图片.下篇 ...
- php下载图片到本地
写了一天,就写了这么点代码,凑合用吧. #saveImage.php<?php /** * 图片下载方法,提供两种图片保存方式: * 1.按照图片自带的名称保存 * 2.按照自定义文件名保存 * ...
- 通过scrapy内置的ImagePipeline下载图片到本地、并提取本地保存地址
1.通过scrapy内置的ImagePipeline下载图片到本地 2.获取图片保存本地的地址 1.通过scrapy内置的ImagePipeline下载图片到本地 1)在settings.py中打开 ...
- scrapy中的ImagePipeline下载图片到本地、并提取本地的保存地址
通过scrapy内置到ImagePipeline下载图片到本地 在settings中打开 ITEM_PIPELINES的注释,并在这里面加入 'scrapy.pipelines.images.Imag ...
- Lrc歌词批量下载助手 MP3歌词批量下载助手
Lrc歌词批量下载助手 MP3歌词批量下载助手 易歌词的服务器已经挂掉,各个主流播放器已不提供明确的下载Lrc服务,当上G的MP3文件遇上苦逼的播放器,二缺就诞生了!本软件就是在这种背景下诞生的 ...
- 利用Node 搭配uglify-js压缩js文件,批量下载图片到本地
Node的便民技巧-- 压缩代码 下载图片 压缩代码 相信很多前端的同学都会在上线前压缩JS代码,现在的Gulp Webpack Grunt......都能轻松实现.但问题来了,这些都不会,难道就要面 ...
- nodejs下载图片到本地,根据百度图片查找相应的图片,通过nodejs保存到本地文件夹
根据百度图片查找相应的图片:输入图片关键字,输入图片数量(默认是30条),通过nodejs将批量保存图片到本地文件夹. 代码已上传到github上:代码github的地址 下载后进去back-end: ...
- 利用node来下载图片到本地
本文是针对于知道图片地址的下载图片方法. 同时也是我的处男作(额,怪怪的〜);不要在意这些细节. 最近在弄项目迁移,需要把http的链接全换成https的:以前的cms不支持http的协议,然后就 ...
- URL地址下载图片到本地
package test.dao; import eh.base.dao.DoctorDAO; import eh.entity.base.Doctor; import junit.framework ...
随机推荐
- C++ //虚析构和纯虚析构
1 //虚析构和纯虚析构 2 3 #include <iostream> 4 #include <string> 5 using namespace std; 6 7 clas ...
- Linux线程属性总结(一)
线程属性标识符:pthread_attr_t 包含在 pthread.h 头文件中. [c] view plaincopy //线程属性结构如下: typedef struct { int ...
- Check Directory Existence in Shell
The following command in one line can check if a directory exists. You can check the return value (& ...
- AQS源码分析看这一篇就够了
好了,我们来开始今天的内容,首先我们来看下AQS是什么,全称是 AbstractQueuedSynchronizer 翻译过来就是[抽象队列同步]对吧.通过名字我们也能看出这是个抽象类 而且里面定 ...
- NOIP 模拟 6 模板
题目 题解 这道题是一道启发式合并的题目,每次合并完重构一下线段树就可以,不用线段树合并. 以操作时间为下标,建立一颗线段树,维护小球的个数与小球的颜色数,最后线段树上二分查找. 我们先不用考虑每个节 ...
- gitlab-ci集成SonarQube代码质量检查
SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误. docker安装 1.拉取 postgres:docker pull postgres:10 2.拉取sona ...
- rsync基本使用
概念 rsync是linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsync主机同步. 目前,已支持跨平台,可以在Windo ...
- dubbo-admin管理控制台安装
拉项目切换分支到master git clone https://github.com/apache/dubbo-admin.git /var/tmp/dubbo-admin 打开项目修改配置 dub ...
- 上传jar包到nexus
注释掉: org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.meeno.boot.oa.OaAutoConfigur ...
- Seata–分布式事务
10.1 分布式事务基础 10.1.1 事务 事务指的就是一个操作单元,在这个操作单元中的所有操作最终要保持一致的行为,要么所有操作都成功,要么所有的操作都被撤销.简单地说,事务提供一种"要 ...