우선 첫번째 전제로 페이지 폼 태그에서
<form action="insert.me" method="POST" enctype="multipart/form-data">
<input type="file" name="photo">
</form>
과 같이 enctype="multipart/form-data"으로 데이터를 전송해야 한다.
두번째 전제로 라이브러리 다운로드
업로드 관련 라이브러리를 pom.xml에 추가하자( https://qdgbjsdnb.tistory.com/237 )
세번째 전제로 업로드 관련 서블릿 xml 설정들
<!-- 파일 업로드를 하기 위해 bean 등록 -->
<beans:bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
<beans:property name="maxUploadSize" value="10000000"></beans:property>
</beans:bean>
용량 10MB 이하만 등록가능 하기 때문에 10MB보다 조금 적게 max를 설정
구현
@RequestMapping("insert.me")
public String insertMember(Member m, Model model, HttpServletRequest request, @RequestParam(value = "photo", required = false) MultipartFile photo) {
System.out.println("Member : " + m);
System.out.println("photo : " + photo);
String root = request.getSession().getServletContext().getRealPath("resources");
String filePath = root + "\\uploadFiles";
// 파일명 변경
String originFileName = photo.getOriginalFilename();
String ext = originFileName.substring(originFileName.lastIndexOf("."));
String changeName = CommonUtils.getRandomString();
try {
photo.transferTo(new File(filePath + "\\" + changeName + ext));
ms.insertMember(m);
return "redirect:goMain.me";
} catch (Exception e) {
new File(filePath + "\\" + changeName + ext).delete();
model.addAttribute("msg", "회원가입 실패!");
return "common/errorPage";
}
}
주목할 부분은 빨간색 글씨로 입력
ext는 기존의 파일의 확장자를 따옵니다.
DB의 중복을 피하기위해 랜덤 String을 생성해 이름을 변경
photo.transferTo(new File(filePath + "\\" + changeName + ext)); 를 통해 저장
만약 DB 등록에 실패하면 new File(filePath + "\\" + changeName + ext).delete();로 저장된 파일 삭제