첨부파일 업로드 처리.
인코딩 타입이 Multipart인 경우 파라미터나 파일을 구하려면 전송데이터를 알맞게 처리해 주어야 한다.
스프링은 Multipart 지원기능을 제공하는데, 이 기능을 이용하면 추가적 처리 없이 Multipart형식의 파라미터와 파일정보를 쉽게 구할 수 있음.
1. MulripartResolver 설정.
먼저 스프링 설정파일에 MultipartResolver를 등록해주어야한다.
pom.xml
<!-- common fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
spring-servlet.xml
<!-- 멀티파트 리졸버 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 최대업로드 가능한 바이트크기 -->
<property name="maxUploadSize" value="52428800" />
<!-- 디스크에 임시 파일을 생성하기 전에 메모리에 보관할수있는 최대 바이트 크기 -->
<!-- property name="maxInMemorySize" value="52428800" / -->
<!-- defaultEncoding -->
<property name="defaultEncoding" value="utf-8" />
</bean>
멀티파트 리졸버는 멀티파트 형식의 데이터가 전송괸 경우, 해당 데이터를 스프링에서 사용할 수 있도록 변환해준다.
스프링이 기본으로 제공하는 MultipartResolver는 CommmnosMultipartResolver이다. CommmnsMultipartResolver는 Commons FileUpload API를 이용해서 Multipart를 처리해준다.
CommmonsMultipartResolver를 MultipartResolver로 사용하려면 다음과 같이 빈 이름으로 "multipartResolver"를 사용해서 등록하면 된다.
@RequestParam 어노테이션 이용한 첨부파일 접근.
업로드한 파일을 전달받는 첫 번째 방법은 @RequestParam 어노테이션이 적용된 MultipartFile 타입의 파라미터를 사용하는 것이다. 예를 들어, HTML 입력폼이 다음과 같이 작성되어 있다고 해보자
<!-- custom file upload -->
<div class="fancy-file-upload fancy-file-primary">
<i class="fa fa-upload"></i>
<input type="file" class="form-control" name="attFiles" onchange="jQuery(this).next('input').val(this.value);" />
<input type="text" class="form-control" placeholder="no file selected" readonly="" />
<span class="button">Choose File</span>
</div>
<div class="fancy-file-upload fancy-file-primary">
<i class="fa fa-upload"></i>
<input type="file" class="form-control" name="attFiles" onchange="jQuery(this).next('input').val(this.value);" />
<input type="text" class="form-control" placeholder="no file selected" readonly="" />
<span class="button">Choose File</span>
</div>
위 코드에서 첨부파일은 attFiles 파라미터를 통해 전달된다.
이경우 Controller에서 @RequestParam 과 MultipartHttpServletRequest 이용해서 첨부파일 데이터를 전달받는다.
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
.
.
@RequestMapping("/board/write.do")
@ResponseBody
public HashMap<String, Object> write(@RequestParam HashMap<String, Object> params,
MultipartHttpServletRequest mReq) {
List<MultipartFile> mFiles = mReq.getFiles("attFiles");
for(MultipartFile mFile : mFiles) {
mFile.getSize()
}
※ MultipartRequest 인터페이스의 파일 관련 주요 메서드
메서드 | 설 명 |
Iterator<String> getFileNames() | 업로드 된 파일들의 이름 목록을 제공하는 Iterator를 구한다. |
MultipartFile getfile(String name) | 파라미터 이름이 name이 업로드 파일 정보를 구한다. |
List<MultipartFile> getFiles(String name) | 파라미터 이름이 name인 업로드 파일 정보 목록을 구한다. |
Map<String, MultipartFile> getFileMap() | 파라미터 이름을 키로 파라미터에 해당하는 파일 정보를 값으로 하는 Map을 구한다. |
컨트롤러에서는 컨트롤 역할만 하는 것이 좋으므로 실제 파일을 저장하는 부분은 service 계층에서 처리한다.
//2. 첨부파일 존재시 board_attach DB에 첨부파일 정보등록
if(params.get("hasFile").equals("Y")) { // 첨부파일 존재시
for(MultipartFile mFile : mFiles) {// 갖고온파일리스트 해체
if(mFile.getSize()!=0) {//파일 존재하면
//DB 에 필요정보 추출 및 파람스에 담기.
params.put("fileName", mFile.getOriginalFilename()); //파일명
params.put("fileType", mFile.getContentType());// 확장자
params.put("fileSize", mFile.getSize());// 사이즈
//make Fake Name
// UUID : 숫자+알파벳 38자 무작위 난수 만듦.
String fakeName = UUID.randomUUID().toString().replace("-", "");
params.put("fakeName", fakeName); // 가짜이름
//필요정보 파람스에 담은 후 ,board_attach DB insert 쿼리날림.(*없던 boardSeq도 담겼다.)
attFileDao.addAttFile(params);
//3. DB에 정보 저장만했으니, 이제 실제파일을 지정해놓은 물리적 위치로 카피 ..
try {
fileUtil.copyFile(mFile, fakeName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}