[MVC2 게시판] 5. 파일 업로드

2016. 12. 1. 15:43Programming/JSP


<파일 업로드 구현 순서>


1) WEB-INF > lib 폴더에 cos.jar 추가


2) BoardAddForm.jsp


1
2
<form action="boardInsert.do" enctype="multipart/form-data" method="post">
<td><input type="file" name="fileName"></td>
cs


2) insertController.java


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
@WebServlet("/boardInsert.do")
public class BoardInsertController extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        //파일 업로드하기
        //http통신 주 파라미터는 문자열,
        //file(이미지나 영상)은 문자열로 이루어져 있으나 용량이 너무 크기 때문에
        //데이터 나눠 보내는 MultipartRequest 이용
        
        //실제 파일 저장 경로를 설정해야
        String savePath = "C:/Users/Increpas/Documents/Jsp_Lesson/Workspace/L15Model2/WebContent/img";
        //String savePath = request.getServletContext().getRealPath("/resources/img");
        //서버는 프로젝트 서버에 올릴 때 임시파일(temp) 만들어서 publishing한다.
        //이를 해제하고 실제 경로에 publishing 하기 위해서는
        //server 더블 클릭 -> server options에
        //server modules without publishing을 체크
        //이러한 임시파일은 서버 종료하면 사라짐
        
        int sizeLimit = 1024*1024*15;
        BoardDao dao = BoardDao.getInstance();
        Board board = new Board();
        String context = request.getContextPath();
        MultipartRequest multi = new MultipartRequest(request, savePath, sizeLimit, "utf-8"new DefaultFileRenamePolicy());
        try{
        
        //insert의 목표
        //우선 이미지만 저장 -> 이미지 파일이 아니면 저장된 파일을 삭제
        //저장된 파일 이름 변경 board_밀리초+.jsp
        //만약 저장된 파일이 이미지 파일이 아니거나 db에 저장 실패할 경우
        //=>저장한 파일 삭제
        
        int num = Integer.parseInt(multi.getParameter("num"));
        Enumeration fileNames=multi.getFileNames(); //파일 이름 반환
        int insert=0;
        boolean save= true//파일 저장 성공
        
        //변수 초기화
        String fileInput = ""//폼으로 받아온 fileName
        String fileName = ""//저장된 파일 이름
        String type = ""//저장된 파일 종류
        File fileObj = null//저장된 파일 객체
        String originFileName = ""//원본 파일 이름
        String fileExtend = ""//jpg,png,gif 등 확장자
        String fileSize = ""//저장된 파일 사이즈
        String newFileName = "board_"+System.currentTimeMillis(); //저장된 파일을 바꿀 이름
        System.out.println("newFileName:"+newFileName);
        
        while(fileNames.hasMoreElements()){
            fileInput = (String)fileNames.nextElement();
            fileName = multi.getFilesystemName(fileInput);
            if(fileName != null){
                type = multi.getContentType(fileInput);
                fileObj = multi.getFile(fileInput);
                originFileName = multi.getOriginalFileName(fileInput);
                fileExtend = fileName.substring(fileName.lastIndexOf(".")+1);//"file1.jpg"라면 jpg 반환
                fileSize = String.valueOf(fileObj.length());//file도 결국 문자열이므로 length()로 반환
                System.out.println("type:"+type+"||originFileName:"+originFileName+
                        "||fileExtend:"+fileExtend+"||fileSize:"+fileSize);
                
                String[] splitType = type.split("/");
                if(!splitType[0].equals("image")){
                    save=false;
                    fileObj.delete(); //저장된 파일 객체로 삭제
                    break;
                }else{//만약 이미지 파일이면 저장 파일의 이름 바꾼다.
                    newFileName += "."+fileExtend;
                    fileObj.renameTo(new File(savePath+"\\"+newFileName));
                }
            }
        }
        
        if(save){ //파일 저장 성공시
            board.setNum(num);
            board.setMem_num(Integer.parseInt(multi.getParameter("mem_num")));
            board.setTitle(multi.getParameter("title"));
            board.setContent(multi.getParameter("content"));
            board.setPasswd(multi.getParameter("passwd"));
            board.setFileName(fileName);
            board.setAddress(savePath+"/"+newFileName);
            insert = dao.insertBoard(board);
        }
        if (save && insert > 0) { //DB insert까지 성공시
            System.out.println("저장 성공");
            response.sendRedirect(context + "/boardDetail.do?num="+num);
        } else {
            System.out.println("저장 실패");
            response.sendRedirect(context + "/boardAddForm.do");
        }
        }catch(Exception e){e.printStackTrace();}
    }
}
cs