스프링 MVC

준비중..

스프링 MVC

스프링을 사용한 웹서비스 만들기

11 파일 업로드

# 파일 업로드 ### 개요 기존의 프로젝트에서는 이미지 파일의 링크 주소를 직접 저장하는 방식이었습니다. 이번에는 파일을 서버로 직접 올려 저장하는 방식을 실습해 봅시다. ### 폼 형식 변경 파일 업로드를 위해 폼의 암호화 형식과 input의 타입 변경해줍니다. ![Imgur](https://i.imgur.com/qWIY2tN.png) **views/books/new.jsp** ```jsp ... <form action="<c:url value="/books" />" method="post" enctype="multipart/form-data"> ... <div class="form-group form-group-lg"> <input name="file" class="form-control-file" type="file"> </div> ... ``` ### 라이브러리 추가 스프링 프로젝트에서 라이브러리들은 pom.xml을 통해서 관리되는거 기억나시나요? 아래의 두 라이브러리들을 설정하여 파일업로드를 할 수 있게 해줍니다. **pom.xml** ```xml <!-- Apache Commons FileUpload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <!-- Apache Commons IO --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> ``` ### 파일 업로드 객체 등록 파일업로드를 담당할 객체를 root-context.xml 파일에 등록시킵니다. 필요할 때 바로바로 가져다 쓸수 있도록 하기위해서죠. **root-context.xml** ```xml <!-- MultipartResolver 설정 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="100000000" /> <property name="maxInMemorySize" value="100000000" /> </bean> ``` > xml 설정 파일 변경 후, 서버를 재시작 시켜주세요 ### 메소드 변경 폼 데이터를 받는 메소드에 내용을 변경시켜 줍니다. **BooksController.java** ```java @RequestMapping(value = "/books", method = RequestMethod.POST) public String create(@ModelAttribute Book book, @RequestParam MultipartFile file, HttpServletRequest request) { String fileUrl = FileHelper.upload("/uploads", file, request); book.setImage(fileUrl); bookMapper.create(book); return "redirect:/books"; } ``` ### 헬퍼클래스 생성 파일업로드를 위한 `FileHelper` 클래스를 만들어 줍니다. **src/main/java/com/mycompany/helper/FileHelper.java** ```java package com.mycompany.helper; import java.io.File; import javax.servlet.http.HttpServletRequest; import org.springframework.web.multipart.MultipartFile; public class FileHelper { public static String upload(String uploadPath, MultipartFile multipartFile, HttpServletRequest request) { String uploadedFileUrl = null; String rootPath = request.getSession().getServletContext().getRealPath("/"); String realUploadPath = rootPath + "/resources" + uploadPath; File dir = new File(realUploadPath); if (!dir.exists()) dir.mkdirs(); File file = new File(dir.getAbsolutePath() + File.separator + multipartFile.hashCode() + multipartFile.getOriginalFilename()); try { multipartFile.transferTo(file); String contextPath = request.getContextPath(); uploadedFileUrl = contextPath + uploadPath + File.separator + file.getName(); } catch (Exception e) { e.printStackTrace(); } return uploadedFileUrl; } } ``` ### 수행 결과 두개의 책이 등록된 상황에서.. ![Imgur](https://i.imgur.com/LWARu76.png) 새 책의 정보를 입력하고 전송!! ![Imgur](https://i.imgur.com/oFo9vyW.png) 정상적으로 잘 나오네요~~ ![Imgur](https://i.imgur.com/0fVNljf.png) 디비 정보 확인과 함께 마무리~~ 끝!! ![Imgur](https://i.imgur.com/2Z6haaT.png) ## Ref. --- 외부 폴더 업로드 후 이미지 접근 - https://gdtbgl93.tistory.com/88