티스토리 뷰

JAVA

[JAVA] 파일 읽기 (업로드)

gray.yoon 2017. 2. 1. 15:50

음... 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=trueString 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
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함