1. 업로드
먼저 파일 업로드를 위한 환경을 추가해주어야 한다.
1) pom.xml 에 의존성을 추가한다.
<!-- fileupload -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
2) spring config xml 파일에 bean을 등록한다.
<!-- MULTIPART RESOLVERS -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000000" />
<property name="maxInMemorySize" value="100000000" />
</bean>
다음은 실제 파일을 업로드하는 페이지 코드를 작성한다.
<form id="form" method="post" action="/upload.do" enctype="multipart/form-data">
<input type="file" />
</form>
form 태그의 인코딩 타입을 multipart/form-data 로 지정해주는 것이 중요하다.
복수 파일을 업로드해야 하는 경우에는 하나의 input 태그에 여러개를 선택할 수도 있지만 이번에는 input 태그를 여러개 추가되도록 했다.
그리고 자바단의 코드를 작성한다.
public void upload(MultipartHttpServletRequest req) throws Exception {
Map<String,MultipartFile> map = req.getFileMap();
//저장경로 확인 및 생성
String path = req.getServletContext().getRealPath("/temp");
File Dir = new File(path);
if(!Dir.exists()){
Dir.mkdir();
}
//파일 실제 내보내기
for(Entry<String, MultipartFile> e : map.entrySet()){
MultipartFile multipartFile = e.getValue();
if (multipartFile.isEmpty()) break;
String upldRefFileNm = multipartFile.getOriginalFilename();
String saveNm = UUID.randomUUID().toString(); //파일명 중복 방지를 위한 uid 생성
String fileExt = path + File.separator + saveNm;
File save = new File(fileExt);
if(save.isFile()) {
multipartFile.transferTo(new File(fileExt));
} else {
multipartFile.transferTo(save);
}
}
}
필요한 코드를 모두 작성하고 테스트를 해보니 다른 파라미터는 정상적으로 받아오는데 file만 null로 들어왔다.
확인 결과 web.xml의 XSS filter와 충돌하여 발생한 문제였다.
<filter>
<filter-name>multipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
<init-param>
<param-name>multipartResolverBeanName</param-name>
<param-value>multipartResolver</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>multipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>XSS</filter-name>
<filter-class>egovframework.template.common.utils.XssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>XSS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2. 다운로드
DB에 저장된 파일 정보를 파라미터로 받아서 다운로드하는 코드이다.
jsp에서 form 전송했을 경우이다.
@RequestMapping("/download.do")
public void download(HttpServletResponse response, @ModelAttribute FileVO filelVO) {
//파일 정보 가져오기
List<FileVO> fileInfo = fileService.selectFileInfo(filelVO);
String fileName = fileInfo.get(0).getFileNm();
String realName = fileInfo.get(0).getRealFileNm();
String saveFile = fileInfo.get(0).getFileChnl().concat("\\") + fileName;
//파일 실제 다운로드
try {
realName = URLEncoder.encode(realName, "UTF-8");
File file = new File(saveFile);
long fileLength = file.length();
response.setHeader("Content-Disposition", "attachment; filename=\"" + realName + "\"");
response.setHeader("Content-Transfer-Encoding", "binary");
response.setHeader("Content-Type", "application/octet-stream");
response.setHeader("Content-Length", "" + fileLength);
response.setHeader("Pragma", "no-cache;");
response.setHeader("Expires", "-1;");
FileInputStream fis = new FileInputStream(saveFile);
OutputStream out = response.getOutputStream();
int readCount = 0;
byte[] buffer = new byte[1024];
while((readCount = fis.read(buffer)) != -1){
out.write(buffer,0,readCount);
}
} catch (Exception e) {
throw new RuntimeException("file save Error");
}
}