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;
}
}
'JAVA' 카테고리의 다른 글
[Java] 핸들러(Handler), 핸들러맵핑(Handler Mapping), 핸들러어댑터(Handler Adapter) - 개발자 배찌 (0) | 2022.10.25 |
---|---|
[Java] 인증번호 1분에 최대 5번만 호출 - 개발자 배찌 (0) | 2022.10.24 |
[java] getSession(), getSession(true), getSession(false) 차이점 - 개발자 배찌 (0) | 2022.07.10 |
jsp 페이지 넘기기 (forward, redirect 차이점) (0) | 2022.07.09 |
[java] 정수를 문자열로, 문자열을 정수로 변환하기 - 개발자 배찌 (0) | 2021.06.26 |