HTML 폼 전송 방식
- application/x-www-form-urlencoded
폼에 입력하여 전송할 항목들을 Http Body에 문자로 username=kim&age=20와 같이 & 형태로 구분하여 전송한다.
파일의 경우 문가가 아닌 바이너리 형식으로 전송해야 한다. 또한 파일과 문자 둘다 전송해야 하는 상황 경우 사용하는 것이 multipart/form-data이다.
Spring Filre Upload
Controller
@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);
}
}
- 파일 업로드 시 쓰는 request 객체 형식은
MultiparyFile
이다
file.toTransferTo(new File( [path] )
을 통해 원하는 경로에 파일을 업로드 한다.
UrlResource
를 통해 파일을 반환하는데 그냥 반환시 바이너리 코드 형식으로 나온다.
- ResponseEntity 형식으로 반환하되 HttpHeader 부분에
attachment
부분을 추가하자
- header에 attachment가 있으면 body에 있는 값을 다운받으라는 뜻이다.
- filename 설정 시 해당 파일이름으로 파일이 다운된다.
HTML Upload Form
<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>
application.properties
test.file = /Users/jelly/Desktop/images/test/