java后台批量下载文件并压缩成zip下载

因项目需要,将服务器上的图片文件压缩打包zip,下载到本地桌面。

首先,前端js:

function doQueryPic() {
	var picsDate =  $("#picsDate").val();
	var piceDate =  $("#piceDate").val();
	var picInst =  $("#pic_inst").combotree("getValue");
	var svrCode =  $("#pic_svr_code").val();
	var picsTime =  $("#pic_stime").val();
	var piceTime =  $("#pic_etime").val();
	if (svrCode == null) {
		$.messager.alert('提示', "请输入交易查询代号");
		return;
	}else{
		$.ajax({
			   type: "POST",
			   url: 'queryPic.translog.action',
			   data: {f_brno:picInst,f_sdate:picsDate,f_edate:piceDate,f_svr_code:svrCode,f_stime:picsTime,f_etime:piceTime},
			   success: function(rcdata){
				  if(rcdata.success){
					  var rows = rcdata.picInfo;
					  var detailHtml = "";
                      for(var i = 0;i < rows.length;i++){
					    detailHtml = detailHtml + "";  
					  }
                    detailHtml = detailHtml + "
全选日期有无影像交易名称交易状态设备编号交易代号所属机构交易时间
" + rows[i].F_DATE + "" + rows[i].ISHASIMG + "" + rows[i].F_TX_NAME + "" + rows[i].F_STUS + "" + rows[i].F_DEV_ID + "" + rows[i].F_SVR_CODE + "" + rows[i].F_BRNO + "" + rows[i].F_TIME + "
"; document.getElementById("details").innerHTML = detailHtml; }else{ $.messager.alert('提示',rcdata.errmsg); } }, error:function(){ alert("查询失败!"); } }); } }

以上代码是查询到相关数据后,显示在界面上,然后按客户需要可以自己选择下载哪几条数据保存。

附上CheckBox全选/取消全选js代码

//checkbox 全选/取消全选
var isCheckAll = false;
function swapCheck() {
	if (isCheckAll) {
		$("input[type='checkbox']").each(function() {
			this.checked = false;
		});
		isCheckAll = false;
	} else {
		$("input[type='checkbox']").each(function() {
			this.checked = true;
		});
		isCheckAll = true;
	}
}
下面代码是用来后台交互的,提示一下,下载文件都不要用ajax来送数据,我之前就是ajax做的,一直没法下载,困扰了一整天后来才发现的,注释部分就是ajax代码,大家作为参考可以看一下:
function downLoadPic() {
	var arr = new Array();                
	var picIDs = document.getElementsByName("pictureID");                
    for (i = 0; i < picIDs.length; i++) {                    
        if (picIDs[i].checked) {                        
            arr.push(picIDs[i].value);                    
        }                
    }
    
	if (arr.length <= 0 ) {
		$.messager.alert('提示', "无下载内容!");
		return;
	}else{
		$('#formPic').attr('action','downLoadPic.translog.action');
		$("#formPic").form('submit',{
			onSubmit:function(){
				
			},
			success:function(data){
				 $.messager.alert('提示','图片下载成功','info');
			}
		});
		/* $.ajax({
			   type: "POST",
			   url: 'downLoadPic.translog.action',
			   data: {pictureList:JSON.stringify(arr)},
			   success: function(rcdata){
				  if(rcdata.success){
					  $.messager.show({
							title : '成功',
							msg : rcdata.errmsg
						});   
				  }else{
					  $.messager.alert('提示',rcdata.errmsg);
				  }
				  
			   },
			   error:function(){
				   alert("查询失败!");
			   }
			}); */
	}
	
}
接下来是后台交互,首先是controller控制层:
/**
     * 图片批量下载
     * @param request
     * @param response
     * @return
     * @throws IOException 
     */
    public void downLoadPic(HttpServletRequest request,HttpServletResponse response) throws IOException{
    	//Map params = getParameters(request);
    	String[] pictureIDs = request.getParameterValues("pictureID");
    	Authentication au=getAuthentication(request);
    	service.downLoadPic(pictureIDs, au, request, response);
		return ;
    }
service层:
public void downLoadPic(String[] params,Authentication au,HttpServletRequest request,HttpServletResponse response) throws IOException {
		
	//压缩文件初始设置
        String path=System.getProperty("ics.webapp.root");//这个是服务器路径地址,request.getSession().getServletContext().getRealPath() 也一样能
        String fileZip = au.getUsername()+"-"+au.getAttribute("F_BRNO")+ "Pictures.zip";
        String filePath = path+"\\" + fileZip;//之后用来生成zip文件
        
        //filePathArr为根据前台传过来的信息,通过数据库查询所得出的pdf文件路径集合(具体到后缀)
        List> fileNameArr = new ArrayList>();
        //JSONArray jsons = JSONArray.fromObject(params.get("pictureList"));
        /*List pictureIDs = new ArrayList();
        for(Object obj:jsons){
        	pictureIDs.add(obj.toString());
        }
        */
        for (int i = 0; i < params.length; i++) {
        	Map speMap = new HashMap();
        	speMap.put("f_date", params[i].substring(0, 8));
        	speMap.put("f_ics_batch", params[i].substring(8));
        	List> reclists=dao.queryLogInfo(speMap);
			for (int j = 0; j < reclists.size(); j++) {
				fileNameArr.add(reclists.get(j));
			}
		}
        
        //需要压缩的文件--包括文件地址和文件名
        //String[] pathtytytyt ={"D:\\13.jpg","D:\\1212.jpg"};
        // 要生成的压缩文件地址和文件名称
        //String desPath = "D:\\DOWNLOADS\\new.zip";
        File zipFile = new File(filePath);
        ZipOutputStream zipStream = null;
        FileInputStream zipSource = null;
        BufferedInputStream bufferStream = null;
        try {
            //构造最终压缩包的输出流
            zipStream = new ZipOutputStream(new FileOutputStream(zipFile));
            for(int i =0;i 0) {
			rc.put("success", true);
			rc.put("picInfo", picInfolList);
			optLogsvc.saveLog(au.getUsername(), au.getAttribute("F_BRNO"), au.getAttribute("F_LSTIP"),
					TOptlogService.TYPE_MR, "", au.getUsername() + "查询批量下载"+params.get("f_svr_code")+"成功!");
		} else {
			rc.put("success", false);
			rc.put("errmsg", "test info");
			optLogsvc.saveLog(au.getUsername(), au.getAttribute("F_BRNO"), au.getAttribute("F_LSTIP"),
					TOptlogService.TYPE_MR, "", au.getUsername() + "查询批量下载"+params.get("f_svr_code")+"失败!");
		}*/
        optLogsvc.saveLog(au.getUsername(), au.getAttribute("F_BRNO"), au.getAttribute("F_LSTIP"),
				TOptlogService.TYPE_MR, "", au.getUsername() + "批量下载图片"+fileZip+"成功!");
		return ;
	}

里面夹杂了json数组转格式问题,前端json传过来的如果是json.stringify格式化的,到后台就得用这种方式进行解析。

本人排版能力不咋样,大家将就看看,那边判断浏览器的也是网上抄的,结果发现根本没有用,无法识别中文,最后妥协了还是使用英文做文件名。如果有碰到中文乱码的,大家可以百度再搜搜,有其他人写过类似文章,我没精力研究了。

这个是压缩服务器上本身存在的文件方法,之前百度相关文章还看到过获取网络图片并压缩下载的,有点意思。

你可能感兴趣的:(java后台批量下载文件并压缩成zip下载)