일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 2023 ICT R&D 주간
- 초등학교 코딩수업
- transaction
- jsp
- spring boot
- 서울시여성가족재단
- 초등학생 코딩수업
- 코딩부트캠프
- 알티노
- Java
- spring
- 자율주행자동차
- 핑퐁로봇
- 2024겨울방학 코딩부트캠프
- 은평구립도서관
- js
- 뚜루뚜루
- 자바
- Cos Pro
- html
- 이것이 자바다
- 도서관 수업
- 2024우먼테크위크
- 초등학생 겨울방학 놀이
- 스마트리움
- 콜백함수
- 코딩수업
- CSS
- Spring Security
- 드론
- Today
- Total
블로그
Interface MultipartFile, Class File (파일 업로드) 본문
Interface MultipartFile, Class File (파일 업로드)
하늘바람a 2024. 5. 28. 17:43Spring 프레임워크
Interface MultipartFile
보통 리액트에서 스프링으로 데이터를 보낼 때 JSON 형식으로 전송하였다.
하지만 json은 텍스트 기반의 데이터 교환 형식이므로 파일이나 사진 등은 JSON로 보낼 수 없다.
사진, 파일은 바이너리 데이터이다. 그러므로 멀티파트 형식(multipart/form-data)을 이용한다.
멀티파트 요청은 HTTP 요청 본문에 파일을 포함시키는 방식이다.
리액트에서 스프링으로 파일 데이터가 전송되는 과정
1. 리액트에서 axios를 사용하여 FormData를 요청 본문으로 전송한다.
이 때, 요청의 Content-Type 헤더는 multipart/form-data로 자동 설정된다.
2. 스프링 서버의 MultipartResolver 빈을 사용하여 요청의 Content-Type을 검사하고 ' multipart/form-data' 인 경우 요청 본문에서 파일 데이터를 추출한다.
3. 추출한 파일 데이터를 MultipartFile 인터페이스로 래핑한다.(MultipartFile에 바인딩한다)
4. 스프링 컨트롤러의 @RequestParam 어노테이션으로 MultipartFile 객체를 주입받는다.x
이렇게 하면 컨트롤러에서 MultipartFile의 메서드(getBytes(),transferTo() 등)을 사용하여 파일 데이터를 직접 다룰 수 있다.
MultipartFile의 메소드 중 일부
transferTo() 설명
"If the destination file already exists, it will be deleted first."
즉, 대상 파일(dest)이 이미 존재한다면 해당 파일을 먼저 삭제한 후에 업로드된 파일의 내용을 dest 파일로 전송(옮기거나 복사)한다는 뜻이다.
따라서 기존에 같은 이름의 파일이 있었다면 그 파일을 덮어쓰게 되는 것이다.
"call this method just once in order to work with any storage mechanism."
이 메서드는 단 한번만 호출할 수 있다는 점도 주의해야 한다. 한번 transferTo로 파일을 옮기거나 복사하면 더 이상 MultipartFile 객체에 파일 데이터가 남아있지 않기 때문이다.
스프링 코드
public void add(Board board, MultipartFile[] files, Authentication authentication) {
board.setMemberId(Integer.valueOf(authentication.getName()));
mapper.insert(board);
if (files != null) {
for (MultipartFile file : files) {
// db에 해당 게시물의 파일 목록 저장
mapper.insertFileName(board.getId(), file.getOriginalFilename());
// 실제 파일 저장
// 부모 디렉토리 만들기
String dir = STR."C:/Temp/prj2/\{board.getId()}";
File dirFile = new File(dir);
if (!dirFile.exists()) {
dirFile.mkdirs();
}
// 파일 경로
String path = STR."C:/Temp/prj2/\{board.getId()}/\{file.getOriginalFilename()}";
File destination = new File(path);
file.transferTo(destination);
}
}
}
Class File
File 클래스의 생성자
File 클래스의 메서드 중 일부
'개발자 준비과정 > Spring, SpringBoot, JSP' 카테고리의 다른 글
ResponseEntity 메서드, Axios로 데이터 가져오기 (0) | 2024.05.21 |
---|---|
엔드포인트 (0) | 2024.05.17 |
@RequestBody와 @ResponseBody (0) | 2024.05.16 |
MyBatis의 @Options 어노테이션: useGeneratedKeys 속성 이해하기 (0) | 2024.05.07 |
Post, Redirect, Get (PRG패턴) (0) | 2024.05.02 |