폼에 입력하여 전송할 항목들을 Http Body에 문자로 username=kim&age=20와 같이 & 형태로 구분하여 전송한다.
파일의 경우 문가가 아닌 바이너리 형식으로 전송해야 한다. 또한 파일과 문자 둘다 전송해야 하는 상황 경우 사용하는 것이 multipart/form-data이다.
@Controller @Slf4j @RequiredArgsConstructor public class ViewController { @Value("${test.file}") ///Users/jelly/Desktop/images/test/ private String fileDir; @GetMapping("/upload") public String newFile() { return "upload-form"; } // 파일 업로드 부분 @PostMapping("/upload") public String saveFile(@RequestParam String itemName, @RequestParam MultipartFile file, HttpServletRequest request) throws IOException { log.info("request={}", request); log.info("itemName={}", itemName); log.info("multipartFile={}", file); System.out.println("fileDir = " + fileDir); if (!file.isEmpty()) { String fullPath = fileDir + file.getOriginalFilename(); log.info("파일 저장 fullPath={}", fullPath); file.transferTo(new File(fullPath)); } return "upload-form"; } // 파일 다운로드 부분 @ResponseBody @GetMapping("/images/{filename}") public ResponseEntity<UrlResource> downloadImage(@PathVariable String filename) throws MalformedURLException { System.out.println("filename = " + filename); UrlResource resource = new UrlResource("file:/Users/jelly/Desktop/images/test/2.png"); String encodedUploadFileName = UriUtils.encode("2.png", StandardCharsets.UTF_8); String contentDisposition = "attachment; filename=\""+encodedUploadFileName+"\""; return ResponseEntity.ok().header( HttpHeaders.CONTENT_DISPOSITION, contentDisposition ).body(resource); } }
MultiparyFile
file.toTransferTo(new File( [path] )
UrlResource
attachment
<html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="utf-8"> </head> <body> <div class="container"> <div class="py-5 text-center"> <h2>상품 등록 폼</h2> </div> <h4 class="mb-3">상품 입력</h4> <form th:action method="post" enctype="multipart/form-data"> <ul> <li>상품명 <input type="text" name="itemName"></li> <li>파일<input type="file" name="file" ></li> </ul> <input type="submit"/> </form> </div> <!-- /container --> </body> </html>
test.file = /Users/jelly/Desktop/images/test/
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.