티스토리 뷰
파일 업로드는 쉬운듯 쉽지 않고 항상 프로젝트의 이슈의 중심에 서있는것 같다. 갑자기 잘 되던 파일 업로드 기능이 안되는 문제가 생겼다.
// 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에 값이 담기게 되고 파일 업로드를 활용할 수 있다.
끝!
'Lang > Servlet&JSP' 카테고리의 다른 글
Jsp에서 yml, properties 사용하기 (1) | 2021.12.13 |
---|---|
JSP 65535 bytes limit 오류 조치 (0) | 2021.09.15 |
the import javax servlet http cannot be resolved 오류 조치 (0) | 2021.05.04 |
Invalid character found in method name .. HTTP method names must be tokens 오류 조치 (0) | 2021.04.09 |
Cannot change version of project facet Dynamic Web Module to 3.0 오류 해결하기 (0) | 2020.07.30 |