https://ssdragon.tistory.com/82
최근에 유입된 게시글을 봤을때 파일 업로드 부분을 보셨기에 좀 더 보충하고자 한다.
사용버전
- Spring Boot 2.6.4
- java 1.8
- Tyhmeleaf (뷰템플릿)
파일 업로드 전송 방식
파일 업로드 전송 방식은 크게 다음과 같이 2가지로 나뉜다.
1. HTML Form 전송
2. HTTP API 전송
HTML Form 전송 방식
1. application/x-www-form-urlencoded
우리가 흔히 HTML Form 데이터를 서버에 전송할 때 쓰이는 기본적인 방법이다.
Form 태그에 별도의 설정을 하지 않았으면 Content-Type이 기본값으로 설정된다.
이 방식은 HTTP Body에 쿼리 파라미터 형식으로 key=value&key2=value2 처럼 보내지게 된다.
파일 업로드를 하려면 문자가 아닌 바이너리 데이터를 전송해야한다.
문자를 전송하는 이 방식으로는 파일 전송이 어렵다.
또한 파일만 전송하는게 아니라 보통 문자까지도 같이 전송하는 점도 생각해야 한다.
(e.g. 이름, 사진)
이 문제를 해결하기 위해 다음 방식을 사용한다.
2. multipart/form-data
이 방식을 사용하려면 Form 태그에 다음과 같이 enctype="multipart/form-data" 를 설정한다.
이제 HTML에서 전송 버튼을 누르면 /save 경로로 post방식의 multipart/form-data를 보내게 된다.
이 멀티파트는 다른 종류의 여러 파일과 내용들을 함께 전송할 수 있어서 multipart 라고 불린다.
이 Form의 입력 결과로 생성된 HTTP 메시지를 보면 전송 항목이 구분되어 있다.
{ "username" : "abc"
"file1" : 스크린샷1.png }
이렇게 데이터를 넣어줬을 때 스프링에서 아래와 같은 HTTP 메시지가 온 것을 볼 수 있다.
입력 결과로 Content-Disposition 이라는 항목별 헤더가 추가되었다.
일반 데이터인 username인 경우 문자로 전송되고,
파일의 경우 파일 이름과 Content-Type이 추가되어 바이너리 데이터가 전송되는 것을 볼 수 있다.
이런식으로 multipart/form-data 는 작동하게 된다.
이제 클라이언트 쪽에서 문자와 파일을 보내봤으니 스프링에서 저 값들을 받아서 실제로 저장까지 해보자.
Spring에서 파일 저장하기
Controller는 아무거나 만들어서 안에 내용을 적으면 된다.
처음 GetMapping은 페이지를 반환해주는 메서드이고, 두번째는 우리가 보낸 HTML Form 데이터를 받는 메서드이다.
스프링은 MultipartFile 이라는 인터페이스를 지원하기에 매우 편하게 파일을 받을 수 있다.
@RequestParam은 HTML Form의 name에 맞추어 적용하면 된다.
MultipartFile.getOriginalFilename() : 업로드 파일명
MultipartFile.transferTo(...) : 파일 저장
실제로 파일이 저장되는 것을 볼 수 있다.
'Spring > Spring' 카테고리의 다른 글
[SpringBoot] 이미지 파일 다운로드 (0) | 2022.07.06 |
---|---|
[스프링시큐리티] Spring Security 5.7 (WebSecurityConfigurerAdapter 에러해결방법) (0) | 2022.07.03 |
[Lombok] @NoArgsConstructor, @ToString (0) | 2022.04.11 |
스프링부트 시큐리티 - SNS 로그인과 SNS 회원가입 (0) | 2022.03.17 |
스프링부트 시큐리티 - 일반 로그인과 회원가입 (0) | 2022.03.17 |