JAVA

[Java] 이미지 일괄다운로드 - 개발자 배찌

개발자 배찌 2022. 10. 19. 18:08
728x90

조회화면에서 체크박스를 눌렀을 때 해당하는
이미지를 일괄다운로드 (zip파일로!) 하는 기능!
조건은 최대 10개 까지만 다운로드 가능하게 제한!

@RequestMapping(value=“/vhcl/vhclInspImgDwnl.hc”)
public ModelAndView vhclInspImgDwnl(HttpServletRequest request, HttpServletResponse response, VhclInspImgFilePVO pvo) throws Exception {
	ModelAndView mav = new ModelAndView(JSON_VIEW);

	response.setStatus(HttpServletResponse,SC_OK);
	resopnse.setContentType(“application/zip”);
	resopnase.addHeader(“Content-Disposition”, “attachment; filename=\“test.zip\””);

	FileOutputStream fos = null;
	ZipOutputStream zipOut = null;
	FileInputStream fis= null;

	//file객체를 생성하여 List에 담기
	List<File> fileList = new ArrayList<File>();
	
	String strSavePath = “/hccs/files/hcs/photo”;
	strSavePath = strSavePath.concat(“/”);
	String zipFileName = “File_” + StringUtils.replace(UUID.randomUUID().toString(), “-”, “”).substring(0,5) + “_” + HcsDateUtil.currDate(“yyyyMMddHHmm”)) + “.zip”;  
	String zipFIlePath = strSavePath.concat(zipFileName);

	try {
		zipOut = new ZipOutputStream(new FileOutputStream(zipFIlePath));

		//실제 서버에 파일들이 저장된 디렉토리 경로
		String filePath = “/hccs/files/hcs/photo”;

		//파일의 목록 얻어오기
		List<VhclInspImgFileRVO> vhclInspImgList = vhclInspImgMngService.getVhclInspImgData(vhclInspImgFIlePVO);

		if(vhclInspImgList != null & vhclInspImgList.size > 0){
			for( VhclInspImgFileRVO item : vhclInspImgList ){
				String sFileName =“”;
				String sFilePathAddr = item.getVhclImgFilePathAddr();
				String sFIlePyscFileNm = item.getVhclImgPyscFileNm();
			
				sFileName = filePath.concat(sFilePathAddr);
				sFileName = sFileName.concat(“/”);
				sFIleName = sFileName.concat(sFIlePyscFileNm);

				FIle sFile = ew File(sFIleName);

				fileList.add(sFile);
			}

			for(File file : fileList){
				zipOut.putNextEntry(new ZipEntry(file.getName()));
				fis = new FileInputStream(file);
				StringUtils.copy(fis, zipOut);
				fis.close();
				zipOut.closeEntry();
			}
			zipOut.close();
		}
	} catch ( Exception e){
		e.printStackTrace();
	} finally {
	}
	mav.addObject(“fileName”, zipFileName);
	mav.addObject(“fileCnt” , fileList.size());
	
	return responseOK(mav);
}





/**
* 파일 양식 다운로드
* @param fileType 파일유형 Temp, drm, photo, agree, dept, xlsform, smarteditor, vcmg, cost, bzpp,excel
* @param fname 파일명 (경로포함)
* @param oriFname 원본파일명 (optional)
* @param downloadView
* @throws Exception
*/
@RequestMapping(“/file/downloadFile.hc”)
public ModelAndView downloadFile(@RequestParam String fileType, @RequestParam Strig fname, @RequestParam(required=false) String oriFname) throws Exception{
	String uploadUrl = new ModelAndView(DOWNLOAD_VIEW);

	String uploadUrl = propertiesService.getString(fileType+”.upload.path”);
	fname = HcsStringUtil.replace(fname, “../”, “”);
	if(!fname.startsWith(“/“)) fname = “/”+fname;
	if(!FileUtils.getFile(uploadUrl+fname).exists()){
		throw new HcsException(“file.err.0002”, null);
	}
	mav.addObject(DownloadView.FILE_NAME, uploadUrl + fname);
	mav.addObject(DownloadView.ORG_FILE_NAME, HcsStringUtil.nvl(oriFname, “”));
	return responseOK(mav);
}
<%— 이미지 일괄 다운로드 —%>
function fnImgDownload(){
	var chkCnt = $(“input:checkbox[name=chkRow]:checked”).length;
	if(chkCnt == 0){
		cmmf_alert(‘다운로드 받을 행을 선택하세요’);
		return;
	}
	if(chkCnt > 10){
		cmmf_toastWarn(“최대 10건까지 다운로드 가능합니다.”);
		return false;
	}
	var chk = $(“input[name=chkRow]:checked”);

	var dwnlParam = new cmmf_param();

	chk.each(function(i){
		var mbrVhclPrctNo=“”; //예약번호
		var vhclImgReqPotClsfCd =‘’; //차량이미지등록시점구분코드
		Var vhclImgClsfCd =‘’; //차량이미지구분코드
		
		var tr = chk.parent().parent().parent().eq(i);
		var td = tr.childeren();

		mbrVhclPrctNo = td.eq(2).text();
		vhclImgReqPotClsfCd = td.eq(3).find(“input”).val();
		vhclImgClsfCd = td.eq(4).find(“input”).val();

		if(mbrVhclPrctNo !== “”){
			dwnlParam.add(“mbrVHclPrctNo”, mbrVhclPrctNo);
			dwnlParam.add(“vhclImgReqPotClsfCd”, vhclImgReqPotClsfCd);
			dwnlParam.add(“vhclImgClsfCd”, vhclImgClsfCd);
		}
	});

	if(dwnlParam.array.length > 0){
		svcf_ajaxParam(“/vhcl/vhclInspImgDwnl.hc”, dwnlParam, {callbackFn:fnImgDwnlCallback});
	}
}

function fnImgDwnlCallback(data) {
	if(data.fileCnt > 0 ){
		var fileName = data.fileName;
		var fileCreateDt = fileName.split(“_”)[2];
		var dwnlFileName = “file_”.concat(fileCreateDt);

		cmmf_fileDownload(“photo”, fileName, dwnlFIleName);
	} else {
		cmmf_toastWarn(“이미지 데이터를 찾기못햇ㅆ	}
}




아래는 이 코드에서 사용한 공통 유틸함수이다.

/**
*현재 시간을 포맷화 한 문자열로 되돌린다.
*/

Public static String current(){
	Calendar jCal = Calendar.getInstance();
	return format(jCal, pattern);
}

public static String format(Calendar date, STring parren){
	Date ddate = date.getTime();
	return format(ddate, pattern);
}

public static String format(Date date, String pattern){
	SimpleDateFormat formatter = new SimpleDateFormat(pattern);
	turn formatter.format(date);
}



var dwnlParam = new cmmf_param();

var svcv_formParam = false; //parameter로 ajax 전송시 사용
var gv_varAjaxTimeou = 30000; //30초
var gv_networkErrorMsg = “네트워크 연결이 되어있지 않습니다. <br>네트워크 확인 후 다시 시도하세요.”;
var gv_defErrorMsg = “잠시 후 다시 사용해주십시오. 문제가 계속될 경우 관리자에게 문의해주세요”;

var cmmf_param(){
	this.array = [];
}

function svcf_ajaxParam(url, params, options){
	if(svcv_formParam) { //form을 제어해야해서 한번에 여러건 호출 불가 주의!
		return false;
	}
	svcv_formParam = true;
	var rf = svcf_getReform(“PARAM”);
	try {
		if(!utlf_isNullofEmpty(params)){
			var robjs;
			if(utlf_isArray(params)){
				robjs = params;
		 	} else {
				robjs = [params];
			}
			for (var ii=0; i<robjs.length; i++){
				svcf_appendForm(rf, robjs[ii]);
			}
		}
		return svcf_ajax(url, rf, options);
	} finally {
		rf.empty(); //form을 재사용할 수 있도록 내용만 지움
		svcv_formParam = false;
	}
	return false;
}


function svcf_getReform(fid){
	var formid = “_REFORM‘ + utlf_nvl(fid, “”);
	var reform = $(“#” + formid);
	if(reform.length == 0){
		reform = $(“<form id=‘“ + formid + “‘></form>”).appendTo(“body”).hide();
	} else {
		reform.empty();	
	}
}

function utlf_nvl(obj.def){
	return utlf_isNull(obj) ? def : obj;
}

function utl_nvnl2(obj, def){
	return utlf_isNullOrEmpty(obj) ? def:obj;
}

function utlf_isNullOrEmpty(obj){
	if(utlf_isNull(obj)){
		return true;
	} else {
		if(typeof obj==“string”){
			if(obj.length < 1){
				return true;
			}	
		}
	}
	return false;
}

function utilf_isNull(obj){
	if(typeof obj == “undefined” || obj == null){
		return true;	
	}
	return false;
}

function utlf_isArray(obj){
	if(!utlf_isNull(obj) && Object.prototype.toString.call(obj) == ‘[object Array]’){
		return true;
	} else {
		return false;
	}
}

function svcf_appendForm(tarform, params){
	if(utlf_isNullOrEmpty(params)){
		return; 
	}
	var arrObj;
	if(typeof params == “string”){
		var p = new cmmf_param();
		var s = params.split(“&”);
		for(var ii= 0; ii<s.length; ++ii){
			var idx = s[ii].indexOf(“=”);
			if(idx > 0){
				p.add(s[ii].substring(0,idx), s[ii].substring(idx +1); //key value로 입력
			)
		}
		arrObj = p.getArray();
	} else if(params instanceof cmmf_param){
		arrObj = params.getArray();
	} else {
		if(utlf_chkKeyValue(params, “name”) && utlf_chkKeyValue(params, “value”)){
			arrObj = [params];
		} else {
				//string, cmmf_param만 처리함
				throw new Error(‘svcf_appendForm은 String, cmmf_param만 지원합니다.’);
				return;
		}
	}

	var isForm = $(tarform).is(“form”);
	for(var ii = 0 ; ii<arrObj.length; ii++){
		if(isForm){
			$(“<input type=‘hidden’ name=‘“ + arrObj[ii].name + “‘/>”).append(tarform).val(arrObj[ii].value);
		} else {
			tarform.append(arrObj[ii].name, arrOBj[ii].value);
		}
	}
}

function utlf_chkKeyValue(object, chkFldNm){
	if(typeof object == “undefined”) return false;
	return (typeof object[chkFldNm]) != “undefined”;
}

/**
* ajax를 통해 서버를 호출
*/
function svcf_ajax(url, fobj, options){
	if(fobj.encoding == “multipart/form-data”){
		fobj.encoding = “application/x-www-form-urlencoded”;
	}
	if(gv_siteGb == “HCS_SM”){
		svcf_appendMenuId(fobj);
	}
	var opts = $.extend({
		type: “POST”,
		dataType: “json”,
		timeout: gv_varAjaxTimeout,
		async: true, 
		customLoading: false,
		customError: false
	}, options);
	opts.url = url;
	opts.data = $(fobj).serializeArray();
	if(opts.snedFn){
		//ajax 요청 전 실행함수
		opts.beforeSend = function(){
			if(!opts.customLoading){
				cmmf_startLoading();
			}
			opts.sendFn.call(null);
		}
	} else {
		if(!opts.customLoading){
			opts.beforeSend = cmmf_startLoading;
		}
	}
	if(opts.stopfn)	{
		//ajax 응답 후 실행함수
		opts.complete = function(){
			if(!opts.customLoading){
				cmmf_endLoading();
			}
			opts.stopFn.call(null);
		}
	} else {
		if(!opts.customLoading){
			opts.complete = cmmf_endLoading;
		}
	}
	if(opts.async){
		opts.success = function(xhrData, textStatus, xhr){
			var rData;
			try {
				rData = svcf_ajaxResponseData.call(this, xhrData); //서버에서 받은 값이 비어있는지 검증
			} catch(e) {
				svcf_ajaxOptionError.call(this, “dataerror”, e);
				return false;
			}
			svcf_ajaxOptionSuccess.call(this, rData);
		};
		opts.error = function(xhr, textStatus, thrownError){
			if(xhr.readyState == 0 && xhr.statusText== “error”){
				//readState가 0인 건은 서버에 요청하지도 못한 경우로 네트워크 장애로 간주함
				cmmf_alert(gv_networkErrorMsg);
				return null;
			}
			if(opts.customError){
				if(opts.errorCallbackFn){
					opts.errorCallbackFn.call(this);
				} else {
					svcf_ajaxOptionError.call(this, textStatus, thrownError);
				}
			} else {
				svcf_ajaxOptionError.call(this, textStatus, thrownError);
			}
		};
	}else {
		opts.callbackFn = null;
		opts.contentExpr = null;
		opts.success = null;
		opts.error = null;
	}

	var result = $.ajax(opts);

	if(!opts.async){
		if(result != nnull && result.readyState == 0 && result.statusText==“error”){
			//readyState가 0인 건은 서버에 욫ㅇ하지도 못한 경우로 네트워크 장애로 간주함
			cmmf_alert(gv_networkErrorMsg);
			return null;
		}
		try {
			result = utlf_unquote(result.responseText);
		} catch (e){
			result = null;
		}
		var rData;
		try {
			rData = svcf_ajaxResponseData.call(opts.result); // 서버에서 받은 값이 비어있는지 검증
		} catch (e){
			svcf_ajaxOptionError.call(opts, null, “dataerror”, e);
			return false;
		}
		var syncRs = svcf_ajaxOptionSuccess.call(opts, rData);
		if(!utlf_isNull(syncRs)){
			syncRs._options_ = opts; //Sync리턴에서 Options을 확ㅇ니해 볼 수 있게 제공
		}
		return syncRs;
	}
}



function svcf_appendMenuId(fobj){
	if(utlf_nvl3(fobj.id, “”).startsWith(“_REFORM”) && $(fobj).find(“input[name=cmmnMenuId]”.size() > 0)){
		//이미 입력된 것으로 보고 skip
		return;
	}
	if($(fobj).find(“input[name=cmmnMenuId]”).size() == 0 ){
		svcf_appendForm(fobj, “cmmnMenuId=“+gv_currMenuId);
	} else {
		$(fobj).find(“input[name=cmmnMenuId]”).val(gv_currMenuId));
	}
)


function cmmf_startLoading(){
	if($(“#cmmdLoading”),size() >0){
		if(!$(“#cmmdLoading”).hasClass(“show”)){
			$(“#cmmdLoading”).addClass(“show”);
		}
	}else{
		$(‘<div class=“preloader show” id=“cmmdLoading”></div>’).appendTo(“body”);
	}
}

function endLoading(){
	if($(“#cmmdLoading”).size() > 0){
		$(“#cmmdLoading”).removeClass(“show”);
	}	
}


//정상 공통처리
function svcf_ajaxOptionSuccess(data){
	if(utlf_isNull(data.errorCode)){
		svcf_setStatus(data, 0, “”);
	}
	if(!!data[“javax.servlet.error.exception”]){
		if(data.errorCode == -999){
			//not login
			if(gv_siteGb == “HCS_EU”){
				if(mobileapp.inapp()){
					//app인 경우 자동로그인 처리를 위해서 재싫행을 호출한다
					cmmf_alert(gv_sessionOutMsg, function(){mobilapp.webtoapp.restart();));
				} else {
					cmmf_alert(gv_sessionOutMsg, function(){cmmf_loginPag(true);});
				}
			} else {
				cmmf_alert(gv_sessionOutMsg, function(){cmmf_loginPag(true);});
			}
		} else if(data.errorCode == -500){
			//공통 오류메시지
			cmmf_alert(gv_defErrorMsg);
		} else {
			cmmf_alert(data.errorMsg);
		}
		return;
	}
	if(this.callbackFn){
		this.callbackFn.call(this, data);
	} else if(this.contentExpr){
		if(data.errorCode ==0){
			$(“#” + this.contentExpr).html(data.content);)
		}
	}
	return data;
}


/**
*로그인페이지 이동함수
*/
Function cmmf_loginPag(isAjax){
	isAjax=utlf_nvl(isAjax, false);
	if(isAjax){
		//Ajax 처리 시 세션만료로 처리되지 못한 경우, 팝업으로 로그인처리 함
		
		//기존 팝업 삭제
		if($(“div.layer-pop:visible”).size() > 0){
			$(“div.layer-pop:visible”).each(function(){
				cmmf_removeFullPop($(this).attr(“id”));
			});
		}
		//로그인 팝업 호출
		if($(“#loginPop”).size()>0){
			//재 호출시 암복호화가 해결이 안되어 메인으로 보냄
			svcf_link(“/main/loginView.hc”);
		} else {
			svcf_ajaxPop(“/main/loginAjaxPop.hc”, document.cmmnHideFrm, “loginPop”, ‘’, cmmf_loginPopCb);
		}
	} else {
		svcf_link(“/main/loginView.hc”);
	}
}
	
fuction utlf_unquote(str){
	return utlf_isNull(str)? str : eval(‘(‘ + str + ‘)’);
}

//서버에서 받은값이 비어있는지 검증
function svcf_ajaxResponseData(xhrData){
	if(utlf_isNull(xhrData)){
		var error=new Error();
		error.code = 10000;
		error.message = “오류가 발생되었습니다”;
		error.description=error.message + “(” + error.code + “)”;
		throw error;
	}
	return xhrData;
}


//오류 공통처리
function svcf_ajaxOptionError(textStatus, thrownError){
	alert(gv_defErrorMsg + “(” + textStatus + “)” );
)

//파일다운로드
Function cmmf_fileDownload(fileType, fileName, oriFname){
	svcf_submitParam(“/file/downloadFile.hc”, “fileType=“+fileType+”&fname=“+fileName+”&oriFname=“+utlf_nvl(oriFname, “”));
}

function svcf_submitParam(url, params, tar, mtd){
	if(svcv_formParam){ //form을 제어해야해서 한번에 여러건 호출 불가 주의!
		return false;
	}
	svcv_formParam = true;
	try{
		var rf=svcf_getReform(“PARAM”);
		if(!utlf_isNullOrEmpty(params)){
			var robjs;
			if(utlf_isArray(params)){
				robjs=params;
			} else {
				robjs=[params];
			}
			for(var ii=0; ii<robjs.length; ++ii){
				svcf_appendForm(rf, robjs[ii]);
			}
		}
		svcf_submit(rf.get(0), url, tar, mtd);
	} finally {
		svcv_formParam = false;
	}

}