package egovframework.com.cmm.service; import java.awt.image.BufferedImage; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Map; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.util.FileCopyUtils; import org.springframework.web.multipart.MultipartFile; import egovframework.let.itsm.asset.service.AssetVO; import egovframework.let.utl.fcc.service.EgovStringUtil; import egovframework.rte.fdl.idgnr.EgovIdGnrService; import egovframework.rte.fdl.property.EgovPropertyService; import net.coobird.thumbnailator.Thumbnails; /** * @Class Name : EgovFileMngUtil.java * @Description : 메시지 처리 관련 유틸리티 * @Modification Information * * 수정일 수정자 수정내용 * ------- -------- --------------------------- * 2009.02.13 이삼섭 최초 생성 * 2011.08.31 JJY 경량환경 템플릿 커스터마이징버전 생성 * * @author 공통 서비스 개발팀 이삼섭 * @since 2009. 02. 13 * @version 1.0 * @see * */ @Component("EgovFileMngUtil") public class EgovFileMngUtil { public static final int BUFF_SIZE = 2048; @Resource(name = "propertiesService") protected EgovPropertyService propertyService; @Resource(name = "egovFileIdGnrService") private EgovIdGnrService idgenService; private static final Logger LOGGER = LoggerFactory.getLogger(EgovFileMngUtil.class); /** * 첨부파일에 대한 목록 정보를 취득한다. * * @param files * @return * @throws Exception */ public List parseFileInf(Map files, String KeyStr, int fileKeyParam, String atchFileId, String storePath, String isThumbFile) throws Exception { int fileKey = fileKeyParam; String storePathString = ""; String atchFileIdString = ""; if ("".equals(storePath) || storePath == null) { storePathString = propertyService.getString("Globals.fileStorePath"); } else { storePathString = propertyService.getString(storePath); } if ("".equals(atchFileId) || atchFileId == null) { atchFileIdString = idgenService.getNextStringId(); } else { atchFileIdString = atchFileId; } File saveFolder = new File(storePathString); if (!saveFolder.exists() || saveFolder.isFile()) { saveFolder.mkdirs(); } // Iterator> itr_bak = files.entrySet().iterator(); // MultipartFile file_bak; // while (itr_bak.hasNext()) { // Entry entry = itr_bak.next(); // // file_bak = entry.getValue(); // String orginFileName = file_bak.getOriginalFilename(); // String aa = "aa"; // } List tmp = new ArrayList(files.values()); ListIterator itr = tmp.listIterator(tmp.size()); MultipartFile file; String filePath = ""; List result = new ArrayList(); FileVO fvo; while (itr.hasPrevious()) { // Entry entry = itr.next(); // file = entry.getValue(); file = itr.previous(); String orginFileName = file.getOriginalFilename(); //-------------------------------------- // 원 파일명이 없는 경우 처리 // (첨부가 되지 않은 input file type) //-------------------------------------- if ("".equals(orginFileName)) { continue; } ////------------------------------------ int index = orginFileName.lastIndexOf("."); String fileExt = orginFileName.substring(index + 1); String newName = KeyStr + EgovStringUtil.getTimeStamp() + fileKey; long _size = file.getSize(); if (!"".equals(orginFileName)) { filePath = storePathString + File.separator + newName; file.transferTo(new File(filePath)); } String thumbName = ""; if(("thumbFile").equals(isThumbFile)) { // file inputstream 으로 섬네일 생성후 저장 // BufferedImage originalImage = ImageIO.read(new File("original.png")); BufferedImage originalImage = ImageIO.read(file.getInputStream()); // BufferedImage thumbnail = Thumbnails.of(originalImage).scale(0.25).asBufferedImage(); // 해상도 BufferedImage thumbnail = Thumbnails.of(originalImage).size(360, 260).asBufferedImage(); // 사이즈 thumbName = newName + "_THUMB"; String thumFilePath = storePathString + File.separator + thumbName; File thumbFile = new File(thumFilePath); ImageIO.write(thumbnail, fileExt, thumbFile); // 서버 파일로 섬네일 저장 // File destinationDir = new File(filePath); // Thumbnails.of(filePath).size(200, 200).toFiles(saveFolder, Rename.PREFIX_DOT_THUMBNAIL); // 이미지 확장자 파일 필요 } fvo = new FileVO(); fvo.setFileExtsn(fileExt); fvo.setFileStreCours(storePathString); fvo.setFileMg(Long.toString(_size)); fvo.setOrignlFileNm(orginFileName); fvo.setStreFileNm(newName); fvo.setAtchFileId(atchFileIdString); fvo.setFileSn(String.valueOf(fileKey)); fvo.setThumbFileNm(thumbName); // writeFile(file, newName, storePathString); result.add(fvo); fileKey++; } return result; } /** * 첨부파일을 서버에 저장한다. * * @param file * @param newName * @param stordFilePath * @throws Exception */ protected void writeUploadedFile(MultipartFile file, String newName, String stordFilePath) throws Exception { InputStream stream = null; OutputStream bos = null; String stordFilePathReal = (stordFilePath==null?"":stordFilePath).replaceAll("..",""); try { stream = file.getInputStream(); File cFile = new File(stordFilePathReal); if (!cFile.isDirectory()) { boolean _flag = cFile.mkdir(); if (!_flag) { throw new IOException("Directory creation Failed "); } } bos = new FileOutputStream(stordFilePathReal + File.separator + newName); int bytesRead = 0; byte[] buffer = new byte[BUFF_SIZE]; while ((bytesRead = stream.read(buffer, 0, BUFF_SIZE)) != -1) { bos.write(buffer, 0, bytesRead); } } catch (FileNotFoundException fnfe) { LOGGER.debug("fnfe: {}", fnfe); } catch (IOException ioe) { LOGGER.debug("ioe: {}", ioe); } catch (Exception e) { LOGGER.debug("e: {}", e); } finally { if (bos != null) { try { bos.close(); } catch (Exception ignore) { LOGGER.debug("IGNORED: {}", ignore.getMessage()); } } if (stream != null) { try { stream.close(); } catch (Exception ignore) { LOGGER.debug("IGNORED: {}", ignore.getMessage()); } } } } /** * 서버의 파일을 다운로드한다. * * @param request * @param response * @throws Exception */ public static void downFile(HttpServletRequest request, HttpServletResponse response) throws Exception { String downFileName = EgovStringUtil.isNullToString(request.getAttribute("downFile")).replaceAll("..",""); String orgFileName = EgovStringUtil.isNullToString(request.getAttribute("orgFileName")).replaceAll("..",""); /*if ((String)request.getAttribute("downFile") == null) { downFileName = ""; } else { downFileName = EgovStringUtil.isNullToString(request.getAttribute("downFile")); }*/ /*if ((String)request.getAttribute("orgFileName") == null) { orgFileName = ""; } else { orgFileName = (String)request.getAttribute("orginFile"); }*/ File file = new File(downFileName); if (!file.exists()) { throw new FileNotFoundException(downFileName); } if (!file.isFile()) { throw new FileNotFoundException(downFileName); } byte[] b = new byte[BUFF_SIZE]; //buffer size 2K. String fName = (new String(orgFileName.getBytes(), "UTF-8")).replaceAll("\r\n",""); response.setContentType("application/x-msdownload"); response.setHeader("Content-Disposition:", "attachment; filename=" + fName); response.setHeader("Content-Transfer-Encoding", "binary"); response.setHeader("Pragma", "no-cache"); response.setHeader("Expires", "0"); BufferedInputStream fin = null; BufferedOutputStream outs = null; try { fin = new BufferedInputStream(new FileInputStream(file)); outs = new BufferedOutputStream(response.getOutputStream()); int read = 0; while ((read = fin.read(b)) != -1) { outs.write(b, 0, read); } } finally { if (outs != null) { try { outs.close(); } catch (Exception ignore) { LOGGER.debug("IGNORED: {}", ignore.getMessage()); } } if (fin != null) { try { fin.close(); } catch (Exception ignore) { LOGGER.debug("IGNORED: {}", ignore.getMessage()); } } } } /** * 첨부로 등록된 파일을 서버에 업로드한다. * * @param file * @return * @throws Exception public static HashMap uploadFile(MultipartFile file) throws Exception { HashMap map = new HashMap(); //Write File 이후 Move File???? String newName = ""; String stordFilePath = EgovProperties.getProperty("Globals.fileStorePath"); String orginFileName = file.getOriginalFilename(); int index = orginFileName.lastIndexOf("."); //String fileName = orginFileName.substring(0, _index); String fileExt = orginFileName.substring(index + 1); long size = file.getSize(); //newName 은 Naming Convention에 의해서 생성 newName = EgovStringUtil.getTimeStamp() + "." + fileExt; writeFile(file, newName, stordFilePath); //storedFilePath는 지정 map.put(Globals.ORIGIN_FILE_NM, orginFileName); map.put(Globals.UPLOAD_FILE_NM, newName); map.put(Globals.FILE_EXT, fileExt); map.put(Globals.FILE_PATH, stordFilePath); map.put(Globals.FILE_SIZE, String.valueOf(size)); return map; } */ /** * 파일을 실제 물리적인 경로에 생성한다. * * @param file * @param newName * @param stordFilePath * @throws Exception */ protected static void writeFile(MultipartFile file, String newName, String stordFilePath) throws Exception { InputStream stream = null; OutputStream bos = null; newName = EgovStringUtil.isNullToString(newName).replaceAll("..", ""); stordFilePath = EgovStringUtil.isNullToString(stordFilePath).replaceAll("..", ""); try { stream = file.getInputStream(); File cFile = new File(stordFilePath); if (!cFile.isDirectory()) cFile.mkdir(); bos = new FileOutputStream(stordFilePath + File.separator + newName); int bytesRead = 0; byte[] buffer = new byte[BUFF_SIZE]; while ((bytesRead = stream.read(buffer, 0, BUFF_SIZE)) != -1) { bos.write(buffer, 0, bytesRead); } } catch (FileNotFoundException fnfe) { LOGGER.debug("fnfe: {}",fnfe); } catch (IOException ioe) { LOGGER.debug("ioe: {}", ioe); } catch (Exception e) { LOGGER.debug("e: {}", e); } finally { if (bos != null) { try { bos.close(); } catch (Exception ignore) { LOGGER.debug("IGNORED: {}", ignore.getMessage()); } } if (stream != null) { try { stream.close(); } catch (Exception ignore) { LOGGER.debug("IGNORED: {}", ignore.getMessage()); } } } } /** * 서버 파일에 대하여 다운로드를 처리한다. * * @param response * @param streFileNm * : 파일저장 경로가 포함된 형태 * @param orignFileNm * @throws Exception */ public void downFile(HttpServletResponse response, String streFileNm, String orignFileNm) throws Exception { // String downFileName = EgovStringUtil.isNullToString(request.getAttribute("downFile")).replaceAll("..",""); // String orgFileName = EgovStringUtil.isNullToString(request.getAttribute("orgFileName")).replaceAll("..",""); String downFileName = EgovStringUtil.isNullToString(streFileNm).replaceAll("..",""); String orgFileName = EgovStringUtil.isNullToString(orignFileNm).replaceAll("..",""); File file = new File(downFileName); //log.debug(this.getClass().getName()+" downFile downFileName "+downFileName); //log.debug(this.getClass().getName()+" downFile orgFileName "+orgFileName); if (!file.exists()) { throw new FileNotFoundException(downFileName); } if (!file.isFile()) { throw new FileNotFoundException(downFileName); } //byte[] b = new byte[BUFF_SIZE]; //buffer size 2K. int fSize = (int)file.length(); if (fSize > 0) { BufferedInputStream in = null; try { in = new BufferedInputStream(new FileInputStream(file)); String mimetype = "text/html"; //"application/x-msdownload" response.setBufferSize(fSize); response.setContentType(mimetype); response.setHeader("Content-Disposition:", "attachment; filename=" + orgFileName); response.setContentLength(fSize); //response.setHeader("Content-Transfer-Encoding","binary"); //response.setHeader("Pragma","no-cache"); //response.setHeader("Expires","0"); FileCopyUtils.copy(in, response.getOutputStream()); } finally { if (in != null) { try { in.close(); } catch (Exception ignore) { LOGGER.debug("IGNORED: {}", ignore.getMessage()); } } } response.getOutputStream().flush(); response.getOutputStream().close(); } /* String uploadPath = propertiesService.getString("fileDir"); File uFile = new File(uploadPath, requestedFile); int fSize = (int) uFile.length(); if (fSize > 0) { BufferedInputStream in = new BufferedInputStream(new FileInputStream(uFile)); String mimetype = "text/html"; response.setBufferSize(fSize); response.setContentType(mimetype); response.setHeader("Content-Disposition", "attachment; filename=\"" + requestedFile + "\""); response.setContentLength(fSize); FileCopyUtils.copy(in, response.getOutputStream()); in.close(); response.getOutputStream().flush(); response.getOutputStream().close(); } else { response.setContentType("text/html"); PrintWriter printwriter = response.getWriter(); printwriter.println(""); printwriter.println("


Could not get file name:
" + requestedFile + "

"); printwriter.println("


Back

"); printwriter.println("


© webAccess"); printwriter.println(""); printwriter.flush(); printwriter.close(); } //*/ /* response.setContentType("application/x-msdownload"); response.setHeader("Content-Disposition:", "attachment; filename=" + new String(orgFileName.getBytes(),"UTF-8" )); response.setHeader("Content-Transfer-Encoding","binary"); response.setHeader("Pragma","no-cache"); response.setHeader("Expires","0"); BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file)); BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream()); int read = 0; while ((read = fin.read(b)) != -1) { outs.write(b,0,read); } log.debug(this.getClass().getName()+" BufferedOutputStream Write Complete!!! "); outs.close(); fin.close(); //*/ } public FileVO parseFileInfOne(MultipartFile multipartFile, String KeyStr, int fileKeyParam, String atchFileId, String uploadFolder, String isThumbFile) { int fileKey = fileKeyParam; String storePathString = ""; String atchFileIdString = ""; FileVO fvo; fvo = new FileVO(); storePathString = propertyService.getString("Globals.fileStorePath"); try { if ("".equals(atchFileId) || atchFileId == null) { atchFileIdString = idgenService.getNextStringId(); } else { atchFileIdString = atchFileId; } File saveFolder = new File(storePathString); if (!saveFolder.exists() || saveFolder.isFile()) { saveFolder.mkdirs(); } String orginFileName = multipartFile.getOriginalFilename(); int index = orginFileName.lastIndexOf("."); String fileExt = orginFileName.substring(index + 1); String newName = KeyStr + EgovStringUtil.getTimeStamp() + fileKey; long _size = multipartFile.getSize(); String filePath = ""; if (!"".equals(orginFileName)) { filePath = storePathString + File.separator + newName; multipartFile.transferTo(new File(filePath)); } String thumbName = ""; fvo.setFileExtsn(fileExt); fvo.setFileStreCours(storePathString); fvo.setFileMg(Long.toString(_size)); fvo.setOrignlFileNm(orginFileName); fvo.setStreFileNm(newName); fvo.setAtchFileId(atchFileIdString); fvo.setFileSn(String.valueOf(fileKey)); fvo.setThumbFileNm(thumbName); }catch(Exception e) { } return fvo; } public List parseFileAssetAll(Map files, String KeyStr, int fileKeyParam, String atchFileId, String storePath, String isThumbFile, AssetVO assetVO) throws Exception { int fileKey = fileKeyParam; String storePathString = ""; String atchFileIdString = ""; if ("".equals(storePath) || storePath == null) { storePathString = propertyService.getString("Globals.fileStorePath"); } else { storePathString = propertyService.getString(storePath); } if ("".equals(atchFileId) || atchFileId == null) { atchFileIdString = idgenService.getNextStringId(); } else { atchFileIdString = atchFileId; } File saveFolder = new File(storePathString); if (!saveFolder.exists() || saveFolder.isFile()) { saveFolder.mkdirs(); } // Iterator> itr_bak = files.entrySet().iterator(); // MultipartFile file_bak; // while (itr_bak.hasNext()) { // Entry entry = itr_bak.next(); // // file_bak = entry.getValue(); // String orginFileName = file_bak.getOriginalFilename(); // String aa = "aa"; // } List tmp = new ArrayList(files.values()); ListIterator itr = tmp.listIterator(tmp.size()); MultipartFile file; String filePath = ""; List result = new ArrayList(); FileVO fvo; while (itr.hasPrevious()) { // Entry entry = itr.next(); // file = entry.getValue(); file = itr.previous(); String orginFileName = file.getOriginalFilename(); //-------------------------------------- // 원 파일명이 없는 경우 처리 // (첨부가 되지 않은 input file type) //-------------------------------------- if ("".equals(orginFileName)) { continue; } ////------------------------------------ int index = orginFileName.lastIndexOf("."); String fileExt = orginFileName.substring(index + 1); String newName = KeyStr + EgovStringUtil.getTimeStamp() + fileKey; long _size = file.getSize(); if (!"".equals(orginFileName)) { filePath = storePathString + File.separator + newName; file.transferTo(new File(filePath)); } fvo = new FileVO(); fvo.setFileExtsn(fileExt); fvo.setFileStreCours(storePathString); fvo.setFileMg(Long.toString(_size)); fvo.setOrignlFileNm(orginFileName); fvo.setStreFileNm(newName); fvo.setAtchFileId(atchFileIdString); fvo.setFileSn(String.valueOf(fileKey)); // writeFile(file, newName, storePathString); result.add(fvo); fileKey++; } return result; } public FileVO parseFileInfOneCopy(MultipartFile multipartFile, String KeyStr, int fileKeyParam, String atchFileId, String uploadFolder, String isThumbFile, FileVO copyFileVO) { //두번 전송불가로 FileVO 가 null 이 아니면 copy int fileKey = fileKeyParam; String storePathString = ""; String atchFileIdString = ""; FileVO fvo; fvo = new FileVO(); storePathString = propertyService.getString("Globals.fileStorePath"); try { if ("".equals(atchFileId) || atchFileId == null) { atchFileIdString = idgenService.getNextStringId(); } else { atchFileIdString = atchFileId; } File saveFolder = new File(storePathString); if (!saveFolder.exists() || saveFolder.isFile()) { saveFolder.mkdirs(); } String orginFileName = multipartFile.getOriginalFilename(); int index = orginFileName.lastIndexOf("."); String fileExt = orginFileName.substring(index + 1); String newName = KeyStr + EgovStringUtil.getTimeStamp() + fileKey; long _size = multipartFile.getSize(); String filePath = ""; if (!"".equals(orginFileName) && _size!=0) { filePath = storePathString + File.separator + newName; if(copyFileVO !=null) { //fileCopy(storePathString+File.separator+copyFileVO.getStreFileNm(), filePath ); //파일복사 Files.copy(new File(storePathString+File.separator+copyFileVO.getStreFileNm()).toPath(), new File(filePath).toPath()); }else { multipartFile.transferTo(new File(filePath)); //파일전송 } } String thumbName = ""; fvo.setFileExtsn(fileExt); fvo.setFileStreCours(storePathString); fvo.setFileMg(Long.toString(_size)); fvo.setOrignlFileNm(orginFileName); fvo.setStreFileNm(newName); fvo.setAtchFileId(atchFileIdString); fvo.setFileSn(String.valueOf(fileKey)); fvo.setThumbFileNm(thumbName); }catch(Exception e) { } return fvo; } //파일을 복사하는 메소드 public static void fileCopy(String inFileName, String outFileName) { try { FileInputStream fis = new FileInputStream(inFileName); FileOutputStream fos = new FileOutputStream(outFileName); int data = 0; while((data=fis.read())!=-1) { fos.write(data); } fis.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } // 파일 확장자 체크 public boolean fileExtsnCheck(List fileResult, String[] exts) { boolean posblAtchFileExtFlag = true; Iterator iter = fileResult.iterator(); while (iter.hasNext()) { FileVO vo = (FileVO) iter.next(); String fileExt = vo.getFileExtsn(); if ((ArrayUtils.indexOf(exts, fileExt.toLowerCase()) == -1)) { posblAtchFileExtFlag = false; return posblAtchFileExtFlag; } } return posblAtchFileExtFlag; } }