티스토리 뷰
음... JAVA 카테고리에서 개발내용 첫 포스팅...
자바 개발자인데 드디어 포스팅을... 하하하
이번에도 똑같이 Ajax Form에서 넘겨준 file을 JAVA에서 처리하는 부분을 정리하도록 하겠다.
보통 File 업로드하면 File을 생성하여 그 파일로 처리하는 경우가 있는데...
나같은 경우 업로드한 파일이 1회성이라 서버쪽에 파일을 따로 저장하지 않고 처리하였다.
그냥 뭐 엑셀이나 TXT파일을 올리면 등록하는 부분이다.
간략하게 컨트롤러에서 아래와 같이 파라미터를 받을 때 파일은 MultipartFile 객체로 받는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | @RequestMapping(value="/fileRegistProc.do") public String fileRegistProc(HttpServletRequest request, HttpServletResponse response, ModelMap model, @RequestParam(value="groupSeq", required=true) String groupSeq, @RequestParam(value="uploadFile", required=true) MultipartFile uploadFile) { <!-- 중간 생략 --> List<AddrVO> addrVOList = null; try{ addrVOList = fileInOutService.AddrFileConvertObject(Integer.parseInt(groupSeq), uploadFile); }catch(FileFormatException ffe){ model.addAttribute("status", false); model.addAttribute("message", ffe.getMessage()); return "jsonResponse"; }catch(Exception e){ model.addAttribute("status", false); model.addAttribute("message", "데이터 처리 중 오류가 발생 하였습니다. 고객센터로 문의 해 주세요."); return "jsonResponse"; } <!-- 중간 생략 --> return "jsonResponse"; } | cs |
서비스에서 File 객체를 전달 받았다. 서비스에서는 엑셀이나 TXT 파일을 받기 때문에 따로 분류 처리를 해주었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Override public List<AddrVO> AddrFileConvertObject(int groupSeq, MultipartFile file) throws Exception { String fileName = file.getOriginalFilename(); String ext = fileName.substring(fileName.lastIndexOf(".")+1,fileName.length()); List<AddrVO> addrVOList = null; InputStreamReader isr = new InputStreamReader(file.getInputStream()); if(ext.equalsIgnoreCase(Constants.FILE_EXTENSION.TXT)){ addrVOList = readTxtFile(groupSeq, isr); } else { addrVOList = readExcelFile(ext, groupSeq, file); } return addrVOList; } | cs |
TXT의 경우 그냥 라인을 읽어서 처리하면 되어서 그냥 넘어가고
엑셀 파일이 넘어온 경우 파일 확장자를 처리하여 XLS 인지 XLSX에 따라 자바 Workbook 객체가 달라지니 해당 부분을 포스팅 하겠다.
이미 다 알고 있겠지만... 그냥 참고용이다.
파일의 경우 InputStream을 읽어 들이면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | public List<AddrVO> readExcelFile(String ext, int groupSeq, MultipartFile file) throws Exception { List<AddrVO> addrVOList = new ArrayList<AddrVO>(); Workbook workbook = null; if(Constants.FILE_EXTENSION.XLS.equalsIgnoreCase(ext)){ workbook = new HSSFWorkbook(file.getInputStream()); }else if(Constants.FILE_EXTENSION.XLSX.equalsIgnoreCase(ext)){ workbook = new XSSFWorkbook(file.getInputStream()); }else{ throw new Exception("지원하지 않는 확장자"); } Sheet workSheet = workbook.getSheetAt(0); // 첫번째 Sheet int rowSize = workSheet.getPhysicalNumberOfRows(); // 행의 총 개수 (행은 0부터 시작) StringBuffer msgSb = new StringBuffer(); msgSb.append("등록한 파일의 "); for(int i=1 ; i < rowSize ; i++){ // i를 1부터 시작해야 두번째 행부터 데이터가 입력된다. Row row = workSheet.getRow(i); int cellLength = (row.getPhysicalNumberOfCells() > 4) ? 4: row.getPhysicalNumberOfCells(); // 열의 총 개수 AddrVO addrVO = new AddrVO(); addrVO.setGroupSeq(groupSeq); if(cellLength < 2){ msgSb.append("필수값이 입력되지 않았습니다."); msgSb.append("(라인 : "+i+"번째)"); throw new FileFormatException(msgSb.toString()); // continue; } String name = ""; String phoneNo = ""; String email = ""; String memo = ""; for(int j = 0 ; j < cellLength ; j ++){ String valueStr = ""; // 엑셀에서 뽑아낸 데이터를 담아놓을 String 변수 선언 및 초기화 Cell cell = row.getCell(j); if( (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK ) && j < 2){ break; // 필수값이 빈값인 경우 무시 }else{ switch(cell.getCellType()){ case Cell.CELL_TYPE_BLANK : break; case Cell.CELL_TYPE_STRING : valueStr = cell.getStringCellValue(); break; case Cell.CELL_TYPE_NUMERIC : valueStr = cell.getNumericCellValue() + ""; break; default : break; } } switch(j){ case 0 : name = valueStr; break; case 1 : phoneNo = valueStr; break; case 2 : email = valueStr; break; case 3 : memo = valueStr; break; default : break; } } addrVO.setName(name); addrVO.setPhoneNo(phoneNo); addrVO.setEmail(email); addrVO.setMemo(memo); if( "".equals(name.trim()) || !StringUtil.isValidPhoneNo(phoneNo.trim()) || ( !"".equals(email.trim()) && !StringUtil.isValidEmail(email.trim()))){ if("".equals(name.trim())){ msgSb.append(Constants.FILE_HEADER_DICTIONARY.NAME); }else if(!StringUtil.isValidPhoneNo(phoneNo.trim())){ msgSb.append(Constants.FILE_HEADER_DICTIONARY.PHONE); }else if(( !"".equals(email.trim()) && !StringUtil.isValidEmail(email.trim()))){ msgSb.append(Constants.FILE_HEADER_DICTIONARY.EMAIL); }else{ continue; } msgSb.append(" 필드의 값이 잘못 입력되었습니다."); msgSb.append("(라인 : "+i+"번째)"); throw new FileFormatException(msgSb.toString()); // continue; // 유효성 검사 시 유효성 검사에서 실패 시 해당 데이터는 skip } addrVOList.add(addrVO); } return addrVOList; } | cs |
이상 파일 읽기 부분의 포스팅을 마친다.
'JAVA' 카테고리의 다른 글
[JAVA] 파일 다운로드 (0) | 2017.02.01 |
---|---|
[JAVA]자바 설치 및 설정하기 (0) | 2012.10.09 |