# 파일 업로드
### 개요
기존의 프로젝트에서는 이미지 파일의 링크 주소를 직접 저장하는 방식이었습니다. 이번에는 파일을 서버로 직접 올려 저장하는 방식을 실습해 봅시다.
### 폼 형식 변경
파일 업로드를 위해 폼의 암호화 형식과 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