참고사이트
[REACT x SPRING BOOT] Axios + multipart/form-data 깔끔하게 받기 (파일 + 게시물 동시에 받기)
[REACT x SPRING BOOT] Axios + multipart/form-data 깔끔하게 받기 (파일 + 게시물 동시에 받기)
2022.02.22 - [실전 공부/AWS&Docker&Linux] - [Docker] Layered jar를 이용한 스프링 부트 Docker build 최적화 [Docker] Layered jar를 이용한 스프링 부트 Docker build 최적화 스프링 부트 메이븐 플러그인 공식 문서 Spring
ktae23.tistory.com
스프링 부분
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ItemDto {
private String name;
private String category;
private int price;
private String photoPath;
private int stockQuantity;
}
@PostMapping("/menuAdd")
public String MenuAdd(@RequestPart MultipartFile file,
@RequestPart("data") ItemDto itemDto){
log.info("file {}", file);
log.info("item {}", itemDto);
return "ok";
}
리액트 부분
const SaveDB = async(formData)=>{
let axiosConfig = {
headers: {
"Content-Type": "multipart/form-data",
}
}
try{
let response = await axios.post("<http://localhost:8080/menuAdd>",formData,axiosConfig)
alert("성공적으로 저장되었습니다.");
}catch{
alert("에러");
}
}
const onSubmit = (e) => {
e.preventDefault(); // 새로고침 막기
e.persist(); // 새로고침 막기
let formData = new FormData(); // formData 객체를 생성한다.
let files = e.target.imgFile.files; // Form의 input을 들고온다.
for (let i = 0; i < files.length; i++) {
formData.append("file", files[i]); // 반복문을 활용하여 파일들을 formData 객체에 추가한다
}
const params = {
category : 카테고리ref.current.value,
name : 메뉴이름ref.current.value,
price : 가격ref.current.value,
stockQuantity : 재고ref.current.value,
photoPath : 이미지경로ref.current.value,
}
formData.append("data", new Blob([JSON.stringify(params)], { type: "application/json" }));
SaveDB(formData);
};
<div className={styles.tbdiv}>
<form onSubmit={(e) => onSubmit(e)}>
<table>
<tbody>
<tr>
<td>
<label>카테고리</label>
</td>
<td>
<select ref={카테고리ref}>
<option value={"Food"}>음식</option>
<option value={"Drink"}>음료</option>
</select>
</td>
</tr>
<tr>
<td>
<label>메뉴이름</label>
</td>
<td>
<input ref={메뉴이름ref}></input>
</td>
</tr>
<tr>
<td>
<label>가격</label>
</td>
<td>
<input ref={가격ref}></input>
</td>
</tr>
<tr>
<td>
<label>재고</label>
</td>
<td>
<input ref={재고ref}></input>
</td>
</tr>
<tr>
<td>
<label>이미지</label>
</td>
<td>
<input readOnly ref={이미지경로ref}></input>
<input type="file" name="imgFile" ref={이미지파일ref}></input>
</td>
<td>
<button>찾기</button>
</td>
</tr>
</tbody>
</table>
<div className={styles.btns}>
<button>취소</button>
<button type="submit">저장</button>
</div>
</form>
application.yml 환경변수 설정
file.dir: \\c:\\upload\\
controller 변수 가져오기, 파일 저장하기
@Value("${file.dir}")
String fileDir;
if(!file.isEmpty()){
String fullPath = fileDir + file.getOriginalFilename();
log.info("파일저장 fullPath={}", fullPath);
file.transferTo(new File(fullPath));
}
파일 보여주기
@ResponseBody
@GetMapping("/images/{filename}")
public Resource downloadImage(@PathVariable String filename) throws MalformedURLException {
// UrlResource로 파일을 읽어서 @ResponseBody로 이미지 바이너리를 반환한다.
// fullPath로 전체 경로 /Users/... 를 가져온다.
return new UrlResource("file:" + fileDir + filename);
}
'Programing > Spring Boot' 카테고리의 다른 글
| Spring boot Data JPA 엔티티를 DTO로 조회하는 방법 (0) | 2023.06.28 |
|---|---|
| JPA 컬렉션을 페치조인하면 페이징이 불가능하다 (0) | 2023.06.28 |
| 코틀린 스프링부트 @RequestBody, @RequestParam, @PathVariable 사용법 (0) | 2023.06.21 |
| 코틀린으로 크롤링 하기 Jsoup 사용 (0) | 2023.05.27 |
| [Spring] Annotation (0) | 2023.01.21 |