์คํ๋ง MVC 2ํธ์ ๊ฐ์ ๋ด์ฉ์ ์ ๋ฆฌํ ํฌ์คํ ์ ๋๋ค.
ํ์ผ ์ ๋ก๋
HTML ํผ์ ์ด์ฉํด ํ์ผ์ ์ ์กํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์๋ค.
application/x-www-form-urlencoded
ํผ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก ์ ์กํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก, ํผ ํ๊ทธ์ ๋ณ๋์ ์ต์
์ด ์์ผ๋ฉด ์น ๋ธ๋ผ์ฐ์ ๋ ์์ฒญ HTTP ๋ฉ์์ง ํค๋์ Content-Type: application/x-www-form-urlencoded
์ด๋ผ๋ ๋ด์ฉ์ ์ถ๊ฐํ๋ค.
multipart/form-data
application/x-www-form-urlencoded์ ์ ์ก ํญ๋ชฉ์ ๋ฌธ์๋ก ์ ๋ฌํ๋ ๋ฐ๋ฉด ํ์ผ์ ์ ์กํ๊ธฐ ์ํด์๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ ์กํด์ผ ํ๋ค. ๋ฌธ์๋ฅผ ์ ์กํ๋ ์์ ๋ฐฉ์์ผ๋ก๋ ํ์ผ์ ์ ์กํ๊ธฐ ์ด๋ ต๊ณ , ๋ณดํต ํผ์ ์ ์กํ ๋ ํ์ผ๋ง ์ ์กํ๋ ๊ฒ์ด ์๋ ๋ฌธ์์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋์์ ์ ์กํด์ผ ํ๋ค๋ ์ ์ด ๋ฌธ์ ๊ฐ ๋๋ค.
ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด HTTP๋ multipart/form-data๋ผ๋ ์ ์ก ๋ฐฉ์์ ์ ๊ณตํ๋ค. ์ด ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ํผ ํ๊ทธ์ ๋ณ๋์ enctype="multipart/form-data"
๋ฅผ ์ง์ ํด์ผ ํ๋ฉฐ, ๋ค๋ฅธ ์ข
๋ฅ์ ์ฌ๋ฌ ํ์ผ๊ณผ ํผ์ ๋ด์ฉ์ ๊ฐ๊ฐ์ ํญ๋ชฉ ๊ตฌ๋ถ์ ํตํด ํจ๊ป ์ ์กํ ์ ์๋ค.
์๋ธ๋ฆฟ๊ณผ ํ์ผ ์ ๋ก๋
์๋ธ๋ฆฟ์ ํตํ ํ์ผ ์ ๋ก๋๋ ์๋์ ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
@Controller
@RequestMapping("/servlet")
public class ServletUploadController {
@GetMapping("/upload")
public String newFile() {
return "upload-form";
}
@PostMapping("/upload")
public String saveFile(HttpServletRequest request) throws ServletException, IOException {
String itemName = request.getParameter("itemName");
Collection<Part> parts = request.getParts();
return "upload-form";
}
}
๋ฉํฐํํธ ์ฌ์ฉ ์ต์
์
๋ก๋ ์ฌ์ด์ฆ๋ฅผ ์ ํํ ์ ์๋๋ฐ, ๊ทธ ํฌ๊ธฐ๋ฅผ ๋์ด์ ํ์ผ์ ์
๋ก๋ํ ๊ฒฝ์ฐ SizeLimitExceededException
์ด ๋ฐ์ํ๋ค.
spring.servlet.multipart.max-file-size=1MB #ํ์ผ ํ๋ ๋น ์ต๋ ํฌ๊ธฐ
spring.servlet.multipart.max-request-size=10MB #๋ฉํฐํํธ ์์ฒญ ํ๋ ๋น ํฌํจ๋ ์ ์ฒด ํ์ผ ํฌ๊ธฐ์ ํฉ
spring.servlet.multipart.enabled ์ต์
ํด๋น ์ต์ ์ true๋ก ์ค์ ํ๋ฉด ์คํ๋ง ๋ถํธ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋์๊ฒ ๋ฉํฐํํธ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ผ๊ณ ์ค์ ํ์ง๋ง, false๋ก ์ค์ ํ๋ฉด ๋ฉํฐํํธ์ ๊ด๋ จ๋ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์๋๋ค.(๊ธฐ๋ณธ ๊ฐ์ true)
๋ด๋ถ์ ์ธ ๋์์ ๋ค์๊ณผ ๊ฐ๋ค.
true๋ก ์ค์ ํ ๊ฒฝ์ฐ ์คํ๋ง์ ๋์คํจ์ฒ ์๋ธ๋ฆฟ์์ ๋ฉํฐํํธ ๋ฆฌ์กธ๋ฒ๋ฅผ ์คํํ๋๋ฐ, ๋ฉํฐํํธ ๋ฆฌ์กธ๋ฒ๋ ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ ์ ๋ฌํ๋ ์ผ๋ฐ์ ์ธ HttpServletRequest๋ฅผ MultipartHttpServletRequest๋ก ๋ณํํด์ ๋ฐํํ๋ค.
์คํ๋ง์ด ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๋ฉํฐํํธ ๋ฆฌ์กธ๋ฒ๋ MultipartHttpServletRequest ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ StandardMultipartHttpServletRequest๋ฅผ ๋ฐํํ๋๋ฐ, ๋ฉํฐํํธ์ ๊ด๋ จ๋ ์ฌ๋ฌ ๊ฐ์ง ์ฒ๋ฆฌ๋ฅผ ํธ๋ฆฌํ๊ฒ ํ ์ ์๋ค.
ํ์ง๋ง ์ดํ ์๊ฐํ MultipartFile์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํธํ๊ธฐ ๋๋ฌธ์ ์ฃผ๋ก ์ฌ์ฉํ์ง๋ ์๋๋ค.
Part
๋ฉํฐํํธ ํ์์ ์ ์ก ๋ฐ์ดํฐ๋ฅผ ํ๋ํ๋ ๊ฐ ๋ถ๋ถ์ธ ํํธ๋ก ๋๋์ด ์ ์กํ๋๋ฐ, ์๋ธ๋ฆฟ์ด ์ ๊ณตํ๋ ํํธ๋ ๋ฉํฐํํธ ํ์์ ํธ๋ฆฌํ๊ฒ ์ฝ์ ์ ์๋ ๋ค์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
part.getSubmittedFileName(): ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ฌํ ํ์ผ๋ช
part.getInputStream(): Part์ ์ ์ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ค.
part.write(...): Part๋ฅผ ํตํด ์ ์ก๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ค.
์๋ธ๋ฆฟ์ด ์ ๊ณตํ๋ ํํธ๋ ํธํ๊ธด ํ์ง๋ง, HttpServletRequest๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ ํ์ผ ๋ถ๋ถ๋ง ๊ตฌ๋ถํ๊ธฐ ์ํด์๋ ์ฌ๋ฌ ๊ฐ์ง ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ง์ ์กด์ฌํ๋ค. ์ด๋ฌํ ๋ถ๋ถ์ ์คํ๋ง์ด MultipartFile์ ํตํด ํธ๋ฆฌํ๊ฒ ์ ๊ณตํ๋ค.
์คํ๋ง๊ณผ ํ์ผ ์ ๋ก๋
์คํ๋ง์ MultipartFile์ด๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ํตํด ํ์ผ ์ ๋ก๋๋ฅผ ํธ๋ฆฌํ๊ฒ ์ง์ํ๊ณ ์๋ค.
@Controller
@RequestMapping("/servlet")
public class SpringUploadController {
@Value("${file.dir}")
private String fileDir;
@GetMapping("/upload")
public String newFile() {
return "upload-form";
}
@PostMapping("/upload")
public String saveFile(@RequestParam String itemName,
@RequestParam MultipartFile file) throws IOException {
if (!file.isEmpty()) {
String fullPath = fileDir + file.getOriginalFilename(); //์
๋ก๋ ํ์ผ ๋ช
file.transferTo(new File(fullPath)); //ํ์ผ ์ ์ฅ
}
return "upload-form";
}
}
์ค์ ํ์ผ์ ์ ๋ก๋/๋ค์ด๋ก๋ํ ๋ ๊ณ ๋ คํ ์ ์ด ์๋๋ฐ, ์์ ๊ฐ์ด ๊ณ ๊ฐ์ด ์ ๋ก๋ํ ํ์ผ๋ช ์ ๊ทธ๋๋ก ์๋ฒ ๋ด๋ถ์ ์ ์ฅํ ๊ฒฝ์ฐ ์๋ก ๋ค๋ฅธ ๊ณ ๊ฐ์ด ๊ฐ์ ์ด๋ฆ์ ์ ์ฅํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ์ถฉ๋์ด ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ ์๋ฒ์์๋ ์ ์ฅํ ํ์ผ๋ช ์ด ๊ฒน์น์ง ์๋๋ก ๋ด๋ถ์์ ๊ด๋ฆฌํ๋ ๋ณ๋์ ํ์ผ๋ช ์ด ํ์ํ๋ค.
'Language & Framework > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํฐ๋][์คํ๋ง ๋ถํธ ํต์ฌ ๊ฐ์ด๋] ๋ฆฌํฌ์งํ ๋ฆฌ ์ธํฐํ์ด์ค ์ค๊ณ (0) | 2023.03.22 |
---|---|
[์คํฐ๋][์คํ๋ง ๋ถํธ ํต์ฌ ๊ฐ์ด๋] ์์์ฑ ์ปจํ ์คํธ (0) | 2023.03.15 |
[์คํ๋ง MVC] ์คํ๋ง ํ์ ์ปจ๋ฒํฐ (0) | 2023.03.05 |
[์คํ๋ง MVC] API ์์ธ ์ฒ๋ฆฌ (0) | 2023.03.04 |
[์คํ๋ง MVC] ์์ธ ์ฒ๋ฆฌ์ ์ค๋ฅ ํ์ด์ง (0) | 2023.03.03 |