Spring 파일 업로드 기능 구현하기
pom.xml
- 파일 업로드를 지원하는 라이브러리를 의존성 추가
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
context-web.xml(빈 등록)
multipartresolver
- 스프링에서 제공하는 파일 업로드를 위한 객체
- 페이지에 첨부파일 선택 필드가 있으면 파일을 실제로 첨부하지 않아도 자동 생성됨
- 첨부파일 유무, 파일명, 컨텐츠타입(png, img 등), 파일 사이즈, 임시파일 스트림 등 API 제공
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
</bean>
VO
public class BookPicture {
private int bookNo;
private String picture;
public BookPicture() {}
public int getBookNo() {
return bookNo;
}
public void setBookNo(int bookNo) {
this.bookNo = bookNo;
}
public String getPicture() {
return picture;
}
public void setPicture(String picture) {
this.picture = picture;
}
- 정보(파일+제품정보) 업로드 관련 java파일
- 2개 이상의 첨부파일 업로드 시 배열이나 컬렉션타입의 변수 선언
- 타입은 MultipartFile 사용
private List<MultipartFile> upfiles;
public List<MultipartFile> getUpfiles() {
return upfiles;
}
public void setUpfiles(List<MultipartFile> upfiles) {
this.upfiles = upfiles;
}
Controller
@PostMapping("/insert.do")
public String save(BookInsertForm form) throws IOException {
// 저장경로 설정
String saveDirectory = "C:\\spring-workspace\\src\\main\\webapp\\resources\\images";
// vo타입의 배열 생성
List<BookPicture> bookPictures = new ArrayList<BookPicture>();
// getUpfiles: form에서 정의한 파일 업로드 관련 메서드
List<MultipartFile> upfiles = form.getUpfiles();
for (MultipartFile multipartFile : upfiles) {
// 첨부파일이 비어있지 않을때 실행
if (!multipartFile.isEmpty()) {
// 첨부파일 이름 조회
String filename = multipartFile.getOriginalFilename();
// 생성해 두었던 VO 객체 생성해서 첨부파일 이름 set
BookPicture bookPicture = new BookPicture();
bookPicture.setPicture(filename);
// 생성한 vo 객체를 List객체에 저장
bookPictures.add(bookPicture);
// 임시 파일로 저장된 첨부파일을 읽어와 in에 저장
InputStream in = multipartFile.getInputStream();
// 지정된 경로에 파일 저장
FileOutputStream out = new FileOutputStream(new File(saveDirectory, filename));
// String이 제공하는 FileCopyUtils 메서드를 이용해 in을 out에 copy
FileCopyUtils.copy(in, out);
}
}
// 제품VO 객체 생성
Book book = new Book();
// 매개변수로 저장되어 있는 값을 Book객체의 멤버변수에 복사
BeanUtils.copyProperties(form, book);
// 책정보와 책사진정보를 서비스메소드에 전달해서 저장
bookService.addNewBook(book, bookPictures);
return "redirect:list.do";
}