티스토리 뷰

파일 업로드는 쉬운듯 쉽지 않고 항상 프로젝트의 이슈의 중심에 서있는것 같다. 갑자기 잘 되던 파일 업로드 기능이 안되는 문제가 생겼다.

// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();

// Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");
factory.setRepository(repository);

// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);

// Parse the request
List<FileItem> items = upload.parseRequest(request);

이번 파일 업로드시 문제가 되는 부분이었다. 이 소스는 Apache Common Fileupload 공식 홈페이지에 나온 소스이고 프로젝트에서는 이와 거의 동일하게 작성을 해서 사용을 하였다. 하지만 마지막 부분의 List<FileItem> items 에 [] (null) 이 담기는 문제가 발생을 하였다. items에 FileItem List가 들어가야지 그 뒤에 작업을 할텐데 계속 값이 들어오지 않아서 원인을 파악하는데 한참 걸렸다. 

 

이유는 항상 있다. 잘 되었었는데 갑자기 안된 이유는 javax.servlet-api version을 3.0.1에서 3.1.0으로 변경을 해서 이에 영향을 받은 것이다. 3.1.0 버전에서는 위와 같이 하면 items에 값을 받을 수 없다. 아래 부분을 다음과 같이 수정을 해줘야 한다. 

List<FileItem> items = new ArrayList<FileItem>();

Iterator it = request.getFileNames();
while(it.hasNext()) {
    List<MultipartFile> list = request.getFiles(it.next().toString());
    for(int i = 0 ; i < list.size() ; i++) {
        CommonsMultipartFile cmpFile = (CommonsMultipartFile)list.get(i);
        items.add(cmpFile.getFileItem());
    }
}

수정을 하면 getFiles와 같은 부분이 오류가 날 것이다. 기존에는 HttpServletRequest request를 가져다 썼다면 request도 MultipartHttpServletRequest로 변경을 해줘야 한다. 최초 호출이 되는 Controller부터 param으로 MultipartHttpServletRequest을 받도록 변경을 해주자. 

 

이렇게 하면 정상적으로 items에 값이 담기게 되고 파일 업로드를 활용할 수 있다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/04   »
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