Sprint MVC
μ νμΌ μ
λ‘λμ λν΄ μμ보기 μ μ Multipart/form-data
μ λν΄ λ¨Όμ μμμΌ ν©λλ€.
μ°λ¦¬κ° μΌλ°μ μΌλ‘ νΌ λ°μ΄ν°λ₯Ό μ μ‘νλ©΄ application/x-www-form-urlencoded
μ νμμΌλ‘ μ μ‘λ©λλ€. HTTP body
μ λ°λ‘ μ μ‘νκ³ μ νλ λ°μ΄ν°κ° λ€μ΄κ°λ ννμ
λλ€.
name=kim&age=26
κ³Ό κ°μ key-value
μμ΄ bodyμ λ€μ΄κ°λ κ²μ΄μ§μ.
μ΄λ κ² λμΌν νμ
μ λ¬Έμ λ°μ΄ν°
λ₯Ό μ μ‘νλ κ²μ μ ν λ¬΄λ¦¬κ° μμ΅λλ€.
νμ§λ§ μ΄λ° key-value
ννμ λ¬Έμλ°μ΄ν°μ λ°μ΄λ리
ννμ νμΌ λ°μ΄ν°κ° ν¨κ» μ μ‘λμ΄μΌ νλ κ²½μ°μ μ΄λ¨κΉμ ?
body
μ μ΄λμ―€μ μ¬κΈ°λΆν°λ νμΌμ΄ μ μ‘λλ κ²μ΄λΌκ³ μλ €μ£Όμ΄μΌ ν ν
λ° μΌλ°μ μΈ application/x-www-form-urlencoded
νμ
μΌλ‘λ λΆκ°λ₯ν©λλ€.
μ μ‘λλ κ° νΌ λ°μ΄ν°λ₯Ό ꡬλΆν΄μ£Όμ΄μΌ ν©λλ€. μ¬κΈ°μ ꡬλΆλλ ν λ¨μλ₯Ό part
λΌκ³ νκ³ λμμ μ¬λ¬ λ¨μμ part
λ₯Ό λλ μ μκΈ°μ multipart
λΌλ μ΄λ¦μ΄ λΆμ κ² μ
λλ€.
ννλ μλμ κ°μ΅λλ€.
============
λ‘ κ΅¬λΆλλ μΌμ’
μ ꡬλΆμλ λμκ°μΌλ‘ κ²°μ λ©λλ€.
Content-Type
μ multipart/form-data
λ‘ νκΈ° μν΄μ form
νκ·Έμ enctype
μ μ§μ ν΄μ£Όμ΄μΌ ν©λλ€.
Springμ MultipartFile
νμ
μ μ 곡ν©λλ€.
λν κ°μ¬νκ²λ @RequestParam
, @ModelAttribute
λ₯Ό λͺ¨λ μ¬μ©ν μ μμ΅λλ€.
λ¨Όμ μ€μ΅μ μν HTMLνμΌμ μμ±νκ² μ΅λλ€.
μνλͺ
κ³Ό μνμ μ΄λ―Έμ§
λ₯Ό μ
λ ₯λ°λ νΌ μ
λλ€.
form
νκ·Έμ μ΅μ
μΌλ‘ enctype
μ μ€μ ν΄μ£Όμ¬μΌ ν©λλ€.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<div>
<h2>μν λ±λ‘ νΌ</h2>
</div>
<h4>μν μ
λ ₯</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>
</body>
</html>
μ΄μ νΌ λ°μ΄ν°λ₯Ό λ°μμ€ μ»¨νΈλ‘€λ¬λ₯Ό μμ±νκ² μ΅λλ€.
μ€μν건 @PostMapping
λ©μλμ
λλ€.
@RequestMappint
μ μ΄μ©ν΄ μνλͺ
κ³Ό νμΌ
μ λ°κ³ μμ΅λλ€. multipart/form-data
κ° μ μ‘λλ ꡬ쑰λ₯Ό 보면 κ° ννΈλ§λ€ name
μ κ°κ³ μκΈ° λλ¬Έμ μ΄λ° μμ νμ±μ΄ κ°λ₯ν κ² κ°μ΅λλ€.
itemName
μ μ λμ΄μλ€κ³ κ°μ νκ³ νμΌλ§ ν
μ€νΈλ₯Ό ν΄λ³Όκ»μ.
MultipartFile
μ getOriginalFilename()
λ©μλλ₯Ό μ§μν©λλ€. μ΄ λ©μλλ νμΌλͺ
κ³Ό νμ₯μκΉμ§ λΆμ¬μ λ¬Έμμ΄μ λ°νν©λλ€.
μ μ₯ν νμΌμ νμΌλͺ
κ³Ό νμ₯μκΉμ§ μμμΌλ μ΄μ κ²½λ‘λ₯Ό μ§μ νκ³ μ μ₯ν΄μ£Όλ©΄ λ©λλ€. νμΌμ μ μ₯νλ κ²½λ‘λ μλ¨μ uploadDiR
μ μ§μ ν΄λμμ΅λλ€. νκ²½λ³μ λ±μΌλ‘ λΉΌλ κ²μ΄ μ’μ§λ§ κ°λ¨ν μ€μ΅μ μν΄ μ΄λ κ² νμ΅λλ€.
μ μ₯ν κ²½λ‘μ νμΌμ μ΄λ¦μ λΆμ¬μ νμΌ μ μ₯μ λν μμ ν κ²½λ‘λ₯Ό λ§λ€μ΄ μ€λλ€.
μμ ν κ²½λ‘λ₯Ό File
κ°μ²΄λ‘ λ§λ€μ΄μ MultipartFile
μ transferTo
λ©μλλ₯Ό νΈμΆνλ©΄ νμΌ μ μ₯μ΄ μλ£λ©λλ€.
@Slf4j
@Controller
public class TestController {
private final String uploadDir = "/Users/jeonhyeji/Documents/etc/file/";
@GetMapping("/review/form")
public String newForm() {
return "upload-form";
}
@PostMapping("/review/form")
public String form(@RequestParam String itemName,
@RequestParam MultipartFile file) throws IOException {
if (!file.isEmpty()) {
String filename = file.getOriginalFilename();
log.info("file.getOriginalFilename = {}", filename);
String fullPath = uploadDir + filename;
file.transferTo(new File(fullPath));
}
return "upload-form";
}
}
κ²°κ³Όμ λλ€.
μ΄μμΌλ‘ κ°λ¨ν νμΌ μ
λ‘λμ λν΄ μμ보μμ΅λλ€.
λ€μμλ μ‘°κΈ λ 볡μ‘ν μμ λ₯Ό ꡬμ±ν΄μ νμΌ μ
λ‘λμ λν΄ κΉκ² μμλ³Όκ»μ.
κ°μ¬ν©λλ€. π
μ λ jspλ₯Ό ν΅ν΄μ μ½λ© μ€μΈλ°
formνκ·Έμ enctypeμ μ λ ₯νμ§ μμλ Controllerμμ μ λ°μμ§λ κ² κ°λλΌκ΅¬μ.
μ κ·Έλ°μ§ νΉμ μμλμ??