티스토리 뷰





반응형

이번엔 첨부파일을 올리는 법에 대해서 포스팅을 할 예정이다. 우선 간략하게 시스템이 돌아가는 것부터 설명을 하자면 input 태그에서 type을 file설정해서 올릴 수 있는데 form으로 웹서버로 넘기게 되면 실질적인 파일은 서버에 지정된 디렉토리에 저장되고 그 파일이름만 DB에 박히게 된다. 이는 DB의 한정적인 용량과 부하를 줄이기 위해 이렇게 되었으며 잘 인지해야되는 부분이라 생각된다. 또한 많은 사람들이 이용을 하게 되면 파일의 이름이 겹칠 가능성이 매우 높아지는데 이를 막기위해 Rename을 사용해야한다. 기본적으로 Default로 제공해주는 것도 있고 내가 직접 만들어서 사용가능하다. 단 절대로 겹칠일이 없도록 로직을 만들어야한다.


왜냐하면 이름이 같은 파일은 서버에서 덮어쓰기가 되어 이전의 파일이 없어진다. 예를 들면 A라는 사용자가 '안녕'이라는 제목의 사진을 올렸는데 B라는 사용자가 '안녕'이라는 이름으로 동영상을 올린다면 사진이 없어지고 동영상으로 덮어씌워지기 때문이다. 


그리고 파일을 전송하는 방법중에 제일 쉬운 방법이 cos.jar를 이용하는 방법이다. 쉽게 구현해 놓은게 있기 때문에 라이브러리만 가져온 뒤에 한줄로 파일을 받아올 수 있다. 방법은 라이브러리를 추가해준 후 form태그에 enctype="multipart/form-data"라는 설정을 꼭 해줘야한다. 


이제 시작해보자, 먼저 cos 파일부터 추가해보자!

http://www.servlets.com/cos/


위 사이트로 들어가 맨 밑에 있는 다운로드를 클릭해 다운을 받고 압출을 풀고나면 lib 폴더에 cos 파일이 1개 있는데 복사를 한 뒤 프로젝트로 돌아와 WEB-INF 밑에 추가해주자.


html은 아주 간단하게 이렇게만 사용할 예정이다.


html 코드도 이렇게 설정하였다. form태그 오른쪽에 보면 아까 말했던

 enctype="multipart/form-data 가 보인다 꼭 체크해주자.

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
<section id="notice-container">
    <form action="<%=request.getContextPath()%>/notice/noticeFormEnd" method="post" enctype="multipart/form-data">
        <table>
        <tr>
            <th>제목</th>
            <td><input type="text" name="title" required="required"></td>
        </tr>
        <tr>
            <th>작성자</th>
            <td><input type="text" value="<%=login.getUserId()%>" name="writer" readonly></td>
        </tr>
        <tr>
            <th>첨부파일</th>
            <td><input type="file" name="upfile"></td>
        </tr>
        <tr>
            <th>내용</th>
            <td><textarea rows="5" cols="50" name="content"></textarea></td>
        </tr>
        <tr>
            <th colspan="2"></th>
            <td><input type="submit" value="등록하기" onclick="return validate();"></td>
        </tr>
        </table>
    </form>
cs


Servlet 코드

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
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //multipart처리를 했는지 안했는지 검사하고 안했다면 경고문 출력
        if(!ServletFileUpload.isMultipartContent(request))
        {
            request.setAttribute("msg""multipart가 정의되어 있지않습니다 관리자에게 문의 하세요");
            request.setAttribute("loc""/");
            request.getRequestDispatcher("/views/common/msg.jsp");
        }
        //절대 경로를 받아와 / 만 추가해줌
        String root = getServletContext().getRealPath("/");
        //서버에 파일이 저장될 경로인데 위에 정보에다 뒤에는 추가적으로 생성할 폴더명을 적어준다.
        String saveDir = root+"upload/notice";
        //파일이 올라갈 수 있는 최대 용량 정하기
        int maxSize = 1024*1024*10//10Mb
        
        //이 밑에 한줄이 정상적으로 작동하면 파일업로드는 이미 된 상태다. 그 밑에가 에러가 나도 옆에 지정해준 경로에는 파일이 업로드 되어있다.
        MultipartRequest mr = new MultipartRequest(request, saveDir,maxSize,"utf-8",new DefaultFileRenamePolicy());
        
        //어찌보면 request를 mr로 바꾼셈이니 아래 데이터를 뽑을땐 mr.get으로 뽑는다.
        String title = mr.getParameter("title");
        String writer = mr.getParameter("writer");
        String content = mr.getParameter("content");
        
        //파일이름
        String fileName = mr.getFilesystemName("upfile");
        
        Notice n = new Notice();
        n.setNoticeContect(content);
        n.setNoticeTitle(title);
        n.setNoticeWriter(writer);
        n.setFilePath(fileName);
        
        int rs = new NoticeService().upNotice(n);
        if(rs>0) {
            System.out.println("저장성공");
            request.setAttribute("msg""공지사항등록 성공");
            request.setAttribute("loc""/notice/noticeList");
        }
            
        else {
            System.out.println("저장실패");
            request.setAttribute("msg""공지사항등록 실패");
            request.setAttribute("loc""/views/notice/noticeForm.jsp");
        }
        request.getRequestDispatcher("/views/common/msg.jsp").forward(request, response);
        
    }
cs


자세한 사항은 나름 꼼꼼하게 주석을 달았으니 보면 될 거고 혹시 이해가 안가는 부분은 댓글로 달면 된다. 

반응형
댓글
반응형
최근에 달린 댓글
글 보관함
Total
Today
Yesterday
최근에 올라온 글
«   2024/12   »
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