첨부파일
스프링에서 첨부파일 업로드 구현하기 (multipart 요청 처리하기)
1. apache commons fileupload 라이브러리 의존성을 추가한다.
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
2. MultipartResolver 객체를 스프링 컨테이너의 빈으로 등록시킨다.
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
<property name="maxUploadSize" value="10485760" />
<property name="maxUploadSizePerFile" value="10485760" />
</bean>
3. 폼 작성하기
<form method="post" action="insert" enctype="multipart/form-data">
제목
<input type="text" name="title" />
내용
<textarea name="content"></textarea>
첨부파일
<input type="file" name="upfile1" />
<input type="file" name="upfile2" disabled />
</form>
4. 폼 클래스 작성하기
public class PostRegisterForm {
private String title;
private String content;
// 업로드된 첨부파일 정보를 표현하는 MultipartFile 객체가 대입되는 멤버변수
private MultipartFile upfile1; // MultipartFile 객체가 들어있다.
private MultipartFile upfile1; // null이 들어있다.
// 업로드된 첨부파일의 이름이 대입되는 멤버변수
private String filename1;
private String filename2;
// Getter, Setter 메소드 작성
}
MultipartFile
* 업로드된 첨부파일 정보를 표현하는 객체다.
* 파일이 업로드되지 않아도 MultipartFile 객체는 생성된다.
* 주요 API
boolean isEmpty()
- 업로드된 파일이 없으면 true를 반환한다.
String getOriginalFilename()
- 업로드된 파일명을 반환한다.
String getContentType()
- 업로드된 파일의 컨텐츠 타입을 반환한다. 예) text/plain, image/png
long getSize()
- 업로드된 파일의 크기를 바이트 단위로 반환한다.
byte[] getBytes()
- 업로드된 파일 데이터를 반환한다.
InputStream getInputStream()
- 업로드된 파일을 읽어오는 스트림을 반환한다.
void transferTo(File dest)
- 지정된 목적지에 업로드된 파일을 전송한다.
5. 요청핸들러 메소드에서 업로드된 첨부파일 처리하기
- 업로드된 첨부파일의 이름을 조회해서 테이블에 저장되게 한다.
- 업로드된 첨부파일을 지정된 위치에 저장시킨다.
public class PostController {
//@Value("${file.save.directory}")
//private String directory;
private String directory = "c:/files";
@PostMapping("/insert")
public String insert(@LoginUser LoginUserInfo loginUserInfo, PostRegisterForm form) {
// 첨부파일 처리하기
MultipartFile upfile1 = form.getUpfile1();
MultipartFile upfile2 = form.getUpfile2();
if (!upfile1.isEmpty()) {
// 파일이름을 조회해서 Form객체에 저장한다.
String filename1 = upfile1.getOriginalFilename();
form.setFilename1(filename1);
// 첨부파일을 지정된 위치에 복사한다(저장시킨다.)
FileCopyUtils.copy(upfile1.getInputStream(), new FileOutputStream(new File(directory, filename1)));
}
if (!upfile2.isEmpty()) {
String filename2 = upfile2.getOriginalFilename();
form.setFilename2(filename2);
FileCopyUtils.copy(upfile2.getInputStream(), new FileOutputStream(new File(directory, filename2)));
}
postService.insertPost(loginUserInfo.getUserId(), form);
}
}