저번시간에 counting까지 해보았습니다.

이번 시간에는 파일 업로드를 해봅시다.

파일 업로드는 게시판에서 빠질 수가 없죠!

그리고 파일 업로드 취약점도 있구요. 일단 보안은 생각안하고 구현만 해봅시다.


파일 업로드에는 뭐가 필요할까요?

먼저 View에서 파일을 올려야할 폼을 추가해야하고

조회할땐 다운로드 할 수 있게해야죠?


컨트롤러에서는 업로드 요청이 들어오면 파일이 담긴 폼데이터를 받는 특수한 형태의 객체를 사용해야합니다.

MultipartRequest라는 녀석인데요. 이를 이용해서 기존의 reqeust객체를 대신해 파일과 파라미터를 받아서 처리해야합니다.


모델에서는 파일을 저장한 공간을 고려해야합니다.

파일을 byte 스트림을 이용해 데이터베이스에 저장할 순 있지만 보통은 그렇게 하지않고, 외부에 저장합니다.

그래도 파일의 위치를 저장해야하니까 기존의 테이블에 파일 이름을 담을 컬럼을 추가하고,

쿼리를 수정해주어야겠죠.

먼저 글쓰기 폼을 수정해야죠.

write.jsp에서 값을 바꾸어줍시다.


<body>


<h1> Write This </h1>

<form action="insert.do" method="post" enctype="multipart/form-data" onsubmit="return formCheck();">

제목 : <input type="text" name="title" /> <br/>

작성자 : <input type="text" name="writer" /> <br/>

내용 : <textarea rows="10" cols="20" name="content"/></textarea> <br/>

파일 : <input type="file" name="filename"><br/>


<input type="submit"/>

</form>


추가된 부분을 표시해두었습니다.

enctype multipart가 추가되었고 파일을 올리는 곳이 생겼습니다.

실행시키면 파일을 올리는 부분이 나올겁니다.


 


그다음으로 폼태그에 action에 등록한 insert.do에 해당하는 InsertAction.Java를 수정하면됩니다.

아까전에 말했듯이 MultipartRequest라는 객체가 필요한데 이것을 사용하기 위해 다음 라이브러리를 사용합니다.

WebContent > WEB-INF > lib

cos.jar

그리고 올라갈 파일들이 있을 폴더가 있어야하므로 Webcontent에 upload 폴더를 만들어 줍시다.

그리고 InsertAction.JAVA를 고쳐주어야합니다.

request.*를 multi로 바꾸어야합니다.

  
  
    MultipartRequest multi = null; 

    int sizeLimit = 10 * 1024 * 1024 ; // 10메가

    String savePath = request.getRealPath("/upload");    // 파일이 업로드될 실제 tomcat 폴더의 WebContent 기준

    try{

    multi=new MultipartRequest(request, savePath, sizeLimit, "euc-kr", new DefaultFileRenamePolicy());

     }catch (Exception e) {

     e.printStackTrace();

     }

    String filename = multi.getFilesystemName("filename");


  String title = multi.getParameter("title");
  String writer = multi.getParameter("writer");
  String content = multi.getParameter("content");
  int count = 0;
  String regip = request.getRemoteAddr();
  

multi로 다 바꾸어주고 파일이 올라갈 것도 같이 만들어 줍니다.

MultipartReqeust랑 DefaultFileRenamePolicy()에 빨간줄이 생길텐데 import하시면 됩니다.

DefaultFileRenamePolicy()는 같은 이름의 파일이 올라오면 filename1, filename2로 자동적으로 숫자를 붙여줍니다.

그리고 실행을 해보고 파일을 올려봅시다. 하지만 아무리 찾아도 올린 파일을 찾을 수가 없어요.

이게 아파치로 실행되면서 다른쪽에 저장되기 때문인데요.

~사용자환경\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\

으로 가시면 파일과 이때까지 작성한 소스를 확인할 수 있습니다.

업로드가 된것을 확인하면 이제 content에서 보여줘야하기때문에 content.jsp를 고쳐줍시다.

 

  <tr>

   <th colspan="2">첨부파일</th>   

   <td colspan="8">${article.filename}</td>

  </tr>

하지만 아직 끝난게 아닙니다.

데이터베이스에 파일 이름을 넣을 칼럼을 추가해주어야하고

board Beans에 변수를 추가하고 게터와 세터를 추가하고 쿼리를 추가하는 작업이 필요합니다.

이건 이때까지 포스팅해온 내용에 다 있기때문에 따로 언급하진 않겠습니다.

잘할 수 있으리라 생각합니다.

 

+ Recent posts