====== webfilemgr_upload 가이드 ====== ===== 예시 ===== 템플릿 위치: /RUNTIME/COMPONENT/WEBFILEMANAGER/webfilemgr_upload 템플릿 파일 * [[xf5projecthome>template/screen/RUNTIME/COMPONENT/WEBFILEMANAGER/webfilemgr_upload.xml|webfilemgr_upload.xml]] * [[xf5projecthome>template/screen/RUNTIME/COMPONENT/WEBFILEMANAGER/webfilemgr_upload.js|webfilemgr_upload.js]] * [[xf5projecthome>template/screen/RUNTIME/COMPONENT/WEBFILEMANAGER/webfilemanager_upload.jsp.txt|webfilemanager_upload.jsp.txt]] * [[xf5projecthome>template/template.html?xframe_screen_url=/RUNTIME/COMPONENT/WEBFILEMANAGER/webfilemgr_upload|새창으로 실행]] ==== 화면 스크립트 ==== // 툴 설치 디렉토리\template\RUNTIME\COMPONENT\WEBFILEMANAGER\fwebfilemanager_upload.jsp.txt -> webfilemanager_upload.jsp 이름 변경후 // 해당 파일을 WAS 서버에 적용하고, 해당 서버 URL로 아래의 strURL 변수값을 변경후 테스트 진행해야 함 var strURL = "http://127.0.0.1:8080/xframe5/template/RUNTIME/COMPONENT/WEBFILEMANAGER/webfilemanager_upload.jsp"; var FSO = new ActiveXObject("Scripting.FileSystemObject"); // 업로드 파일 정보 추가 버튼 이벤트 처리 function btnAddFileDirect_on_mouseup(objInst) { AddUploadFileInfoToGrid("C:\\Temp\\Upload\\150MB_1.zip"); AddUploadFileInfoToGrid("C:\\Temp\\Upload\\150MB_2.zip"); } // 파일 선택 다이얼로그를 통한 업로드 파일 정보 추가 버튼 이벤트 처리 function btnSelectFile_on_mouseup(objInst) { var strSelectFile, bMultiSelect, arrFilePath, nFilePathCount, nFileIndex; bMultiSelect = true; strSelectFile = factory.showfileopendialog("*.*", "C:\\", "", "파일열기", bMultiSelect); if (strSelectFile != "") { arrFilePath = strSelectFile.split("|"); nFilePathCount = arrFilePath.length; for (nFileIndex = 0; nFileIndex < nFilePathCount; nFileIndex++) { AddUploadFileInfoToGrid(arrFilePath[nFileIndex]); } } } // 탐색기에서 그리드로 파일 Drop 이벤트 처리 function gridUpload_on_dropfiles(objInst, arrDropFilePath, nDropFileCount) { var strFilePath, nFileIndex; for (nFileIndex = 0; nFileIndex < nDropFileCount; nFileIndex++) { AddUploadFileInfoToGrid(fso, arrDropFilePath[nFileIndex]); } } // 업로드 대상 파일 정보를 그리드에 추가 function AddUploadFileInfoToGrid(strFilePath) { var objFile; gridUpload.insertitemtext(gridUpload.getrowcount(), 0, strFilePath); // 파일 오브젝트를 생성하여 파일 크기 정보를 구하여 표시 objFile = FSO.GetFile(strFilePath); gridUpload.setitemtext(gridUpload.getrowcount() - 1, 1, parseInt((objFile.Size / 1024) + 0.5, 10)); } //업로드 시작 버튼 이벤트 처리 function btnMultiUpload_on_mouseup(objInst) { var nRow, strFilePath, nUploadIndex, nResultCount; // 웹 파일매니저에 설정된 모든 업로드 대상 파일 목록을 삭제 webfile.deletealluploadfile(); // 업로드 대상 파일 정보 추가 for (nRow = 0; nRow < gridUpload.getrowcount(); nRow++) { strFilePath = gridUpload.getitemtext(nRow, 0); if (strFilePath.length <= 0) { continue; } webfile.adduploadfile(strFilePath); } // 업로드 진행창 표시 여부 var bShowProcWnd = true; // 업로드 시작 if (webfile.requestupload(bShowProcWnd, strURL, "", "") == false) { factory.consoleprint("startupload error"); } // 업로드 결과 갯수를 구함 nResultCount = webfile.getuploadresultcount(); // 업로드 결과 갯수만큼 Loop for (nUploadIndex = 0; nUploadIndex < nResultCount; nUploadIndex++) { // 업로드 결과 코드를 구함 nResultCode = webfile.getuploadresultcode(nUploadIndex); // 업로드 결과 코드에 따라서 그리드에 결과 표시 if (nResultCode == 1) { gridUpload.setitemtext(nUploadIndex, 2, "성공"); gridUpload.setitemtext(nUploadIndex, 3, webfile.getuploadresultfilename(nUploadIndex)); } else if (nResultCode == 0) { gridUpload.setitemtext(nUploadIndex, 2, "오류메세지 수신"); gridUpload.setitemtext(nUploadIndex, 3, webfile.getuploadresulterrormsg(nUploadIndex)); } else { gridUpload.setitemtext(nUploadIndex, 2, "오류"); gridUpload.setitemtext(nUploadIndex, 3, webfile.getuploadresulterrormsg(nUploadIndex)); } } // 업로드 후 업로드 결과에 대한 정보 및 수신 데이터를 담고 있는 정보들을 모두 지우는 API이다. // 업로드의 모든 처리가 끝난 후에는 해당 정보를 삭제 하는게 메모리 관리에 유리하다. webfile.deletealluploadresultinfo(); btnMultiUpload.setfocus(); } ==== webfilemanager_upload.jsp 스크립트 ==== <%@ page import="java.io.File" %> <%@ page import="java.io.IOException" %> <%@ page import="java.io.PrintWriter" %> <%@ page import="java.io.UnsupportedEncodingException" %> <%@ page import="java.util.HashMap" %> <%@ page import="java.util.Iterator" %> <%@ page import="java.util.List" %> <%@ page import="org.apache.commons.fileupload.FileItem" %> <%@ page import="org.apache.commons.fileupload.FileUploadException" %> <%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %> <%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %> <%@ page import="org.apache.commons.io.FilenameUtils" %> <%@ page import="org.apache.log4j.Logger" %> <%! // create logging object Logger logger = Logger.getLogger(getClass()); // Define WebFileManager(WFM) Constant String WFM_DATA_DEL = String.valueOf((char)0x1A); // data delimeter String WFM_DATASTART_DEL = String.valueOf((char)0x1C); // data start indicator옉 String WFM_DATAEND_DEL = String.valueOf((char)0x1F); // data end indicator int maxMemoryFileSize = 10; // maximum memory file size int maxFileSize = 1000 * 1024 * 1024; // maximum file size (100MB) String errorMsg = ""; String contextRootDir = ""; String tempDirAbsolutePath = ""; String saveBaseDirAbsolutePath = ""; %> <% ServletFileUpload uplaodHandler = null; // file uplaod handler List fileItemList = null; // file item list FileItem fileItem = null; // file item HashMap paramMap = new HashMap(); // parameter map String strResultMsg = WFM_DATASTART_DEL; out.clearBuffer(); logger.info("=============================================================="); logger.info("webfilemanager upload start"); // Set cross domain response header response.setHeader("Access-Control-Allow-Credentials", "true"); if (request == null) { logger.error("Access-Control-Allow-Origin = *"); response.setHeader("Access-Control-Allow-Origin", "*"); } else { logger.error("Access-Control-Allow-Origin = " + request.getHeader("Origin")); response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); } response.setHeader("Access-Control-Allow-Headers", "X-Requested-With"); // Set upload file temp dir, save base dir path // setUploadEnvSetting(getServletContext()); // servlet 3.0 spec setUploadEnvSetting(request.getSession().getServletContext()); // Check whether the request has multipart data content. boolean isMultipart = ServletFileUpload.isMultipartContent(request); if (!isMultipart) { try { logger.error("There is no multipart data in request"); strResultMsg += getErrorMsg("", "There is no multipart data in request"); strResultMsg += WFM_DATAEND_DEL; out.print(strResultMsg); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return; } // Create a file upload handler uplaodHandler = getFileUploadProcessor(); logger.info("Success to create a file upload handler"); // parse the request try { fileItemList = uplaodHandler.parseRequest(request); } catch (FileUploadException ex) { try { logger.error("Fail to parse a request"); strResultMsg += getErrorMsg("", "Fail to parse a request"); strResultMsg += WFM_DATAEND_DEL; out.print(strResultMsg); } catch (UnsupportedEncodingException e) { logger.error("Exception msg = " + e.getMessage()); e.printStackTrace(); } return; } logger.info("Success to parse a request"); // Process the parameter Iterator iter1 = fileItemList.iterator(); while (iter1.hasNext()) { fileItem = (FileItem)iter1.next(); // process a regular form field if (fileItem.isFormField()) { String fieldName = fileItem.getFieldName(); String fieldValue = fileItem.getString("UTF-8"); logger.info("fieldName = " + fieldName + ", fieldValue = " + fieldValue); paramMap.put(fieldName, fieldValue); } } Iterator iter2 = fileItemList.iterator(); while (iter2.hasNext()) { fileItem = (FileItem)iter2.next(); // process a regular form field if (fileItem.isFormField()) { continue; } String fileItemFileName = fileItem.getName(); String fileResultMsg = null; try { // process a upload multipart data String saveFileName = handleUploadFile(fileItem, paramMap); if (saveFileName == null) { fileResultMsg = getErrorMsg(fileItemFileName, errorMsg); } else { // make a success message fileResultMsg = getSuccessMsg(fileItemFileName, saveFileName); } logger.info("fileResultMsg = [" + fileResultMsg + "]"); // add one file process message to return message strResultMsg += fileResultMsg; } catch (Exception ex) { logger.error("Exception Msg = " + ex.getMessage()); ex.printStackTrace(); fileResultMsg = getErrorMsg(fileItemFileName, "Fail to process upload file."); // add one file process message to return message strResultMsg += fileResultMsg; } } // add data end delimiter strResultMsg += WFM_DATAEND_DEL; logger.info("strResultMsg = [" + strResultMsg + "]"); out.print(strResultMsg); %> <%! // Set upload file temp dir, save base dir path public void setUploadEnvSetting(ServletContext context) { // get context real path contextRootDir = context.getRealPath("/"); if(contextRootDir.endsWith(File.separator) == false) { contextRootDir += File.separator; } // temporary directory absolute path for temporary file tempDirAbsolutePath = contextRootDir + "temp"; saveBaseDirAbsolutePath = contextRootDir + "upload"; logger.info("tempDirAbsolutePath = " + tempDirAbsolutePath); logger.info("saveBaseDirAbsolutePath = " + saveBaseDirAbsolutePath); makeDirUsingDirPath(tempDirAbsolutePath); makeDirUsingDirPath(saveBaseDirAbsolutePath); return; } // handle a upload file data public String handleUploadFile(FileItem fileItem, HashMap paramMap) throws Exception { String saveFileAbsolutePath = ""; // file absolute path to save String saveFileName = ""; String filePath = fileItem.getName(); // HTML??File Item Name String fileName = FilenameUtils.getName(filePath); // file name String paramDirPath = ""; String paramFileName = ""; logger.info("filePath = " + filePath); logger.info("fileName = " + fileName); logger.info("getContentType = " + fileItem.getContentType()); logger.info("getSize = " + fileItem.getSize()); // get file save information paramDirPath = paramMap.get("DIR_PATH") == null ? "" : (String)paramMap.get("DIR_PATH"); paramFileName = paramMap.get("FILE_NAME") == null ? "" : (String)paramMap.get("FILE_NAME"); logger.info("paramDirPath = [" + paramDirPath + "]"); logger.info("paramFileName = [" + paramFileName + "]"); // set save directory absolute path saveFileAbsolutePath = saveBaseDirAbsolutePath; if (paramDirPath.length() > 0) { saveFileAbsolutePath = saveFileAbsolutePath + File.separatorChar + paramDirPath; } // set save file absolute path if (paramFileName.length() > 0) { saveFileName = paramFileName; } else { saveFileName = fileName; } saveFileAbsolutePath = saveFileAbsolutePath + File.separator + saveFileName; logger.info("saveFileAbsolutePath = " + saveFileAbsolutePath); // make a directory for file path makeDirUsingFilePath(saveFileAbsolutePath); // save a upload file to a save file absolute path while (true) { int retryCount = 0; try { fileItem.write(new File(saveFileAbsolutePath)); break; } catch(Exception e) { logger.error("Exception Msg = " + e.getMessage()); retryCount++; if (retryCount > 5) { logger.error("Fail to wirte a file"); errorMsg = "Fail to wirte a file"; return null; } else { try { Thread.sleep(1000); } catch (InterruptedException ignore) { ; } continue; } } } logger.info("Success To Wirte File, saveFileName = " + saveFileName); // delete a file item content? fileItem.delete(); // return a saved file name return saveFileName; } //TODO: change a character set of message public String msgCharacterSetConvert(String message) throws UnsupportedEncodingException { if (message == null) { return ""; } /* logger.info("don't change character set"); return message; */ logger.info("change character set UTF-8 -> ISO-8859-1"); return new String(message.getBytes("UTF-8"), "ISO-8859-1"); } // make a success message public String getSuccessMsg(String fileName, String saveFileName) throws UnsupportedEncodingException { StringBuffer returnMsg = new StringBuffer(); returnMsg.append("Result=\"success\"&"); returnMsg.append("FileName=\"" + fileName + "\"&"); returnMsg.append("SaveFileName=\"" + saveFileName + "\""); returnMsg.append(WFM_DATA_DEL); return msgCharacterSetConvert(returnMsg.toString()); } // make a error message public String getErrorMsg(String fileName, String errorMsg) throws UnsupportedEncodingException { StringBuffer returnMsg = new StringBuffer(); returnMsg.append("Result=\"error\"&"); returnMsg.append("FileName=\"" + fileName + "\"&"); returnMsg.append("Message=\"" + errorMsg + "\""); returnMsg.append(WFM_DATA_DEL); return msgCharacterSetConvert(returnMsg.toString()); } private String getRandomFileName() { return java.util.UUID.randomUUID().toString().replace("-", ""); } // get a file upload process private ServletFileUpload getFileUploadProcessor() { // create a new file item factory DiskFileItemFactory factory = new DiskFileItemFactory(); // create a new file object for a temporary directory File tempDir = new File(tempDirAbsolutePath); // create a temporary directory if(!tempDir.exists()) { tempDir.mkdirs(); } // set a temporary directory factory.setRepository(tempDir); // set a maximum memory file size factory.setSizeThreshold(maxMemoryFileSize); // create a servlet file upload object using a factory ServletFileUpload upload = new ServletFileUpload(factory); // set a maixmum file size upload.setSizeMax(maxFileSize); // set header encoding characterset for hangul file name upload.setHeaderEncoding("UTF-8"); return upload; } // make a directory using a file path public void makeDirUsingFilePath(String fileAbsolutePath) { File oFile = new File(fileAbsolutePath); File oDir = oFile.getParentFile(); // create a diectory if (!oDir.exists()) { oDir.mkdirs(); } } // make a directory using a dir path public void makeDirUsingDirPath(String dirAbsolutePath) { File oDir = new File(dirAbsolutePath); // create a diectory if (!oDir.exists()) { oDir.mkdirs(); } } %>