์๋ธ๋ฆฟ์ ์ด์ฉํ HTML Form ํ์ผ ์ ๋ก๋
by rlaehddnd0422HTML Form์ ์ด์ฉํ ํ์ผ ์ ์ก
ํ์ผ์ ์๋ฒ์ ์ ์กํ๊ธฐ ์ํด์๋ ์์ ์๋ธ๋ฆฟ์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ์คํ๋ง์ด ์ง์ํ๋ MultipartFile๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋๋ฐ ์ด ํฌ์คํ ์์ ํ๋ฒ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ฐ์ ์์๋์ด์ผ ํ ์ ์ HTML Form์ ํตํด ํ์ผ์ ์ ๋ก๋ ํ๊ณ ์ ํ ๋๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ www-form-urlencoded Content Type์ด ์๋ ๋ค๋ฅธ ํ์(multipart/form-data)์ ์ฌ์ฉํ๋ค๋ ์ ์ ๋๋ค!
Content-Type : application/x-www-form-urlencoded
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ
- HTTP Body์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์์ผ๋ก ์ ์ก๋ฉ๋๋ค.
- ๋ฌธ์ ์ ์ก์ ์ฌ์ฉ๋ฉ๋๋ค.
Content-Type : multipart/form-data
- ๋ฌธ์ ๋ฟ๋ง ์๋๋ผ ํ์ผ ์ ์ก๋ ์ง์
- ํ์ผ์ ๋ฐ์ด๋๋ฆฌ๋ก ์ ์ก๋ฉ๋๋ค.
- ์ด ๋ฐฉ์์ ์ฌ์ฉํ๋ ค๋ฉด Form ํ๊ทธ์ ๋ณ๋๋ก enctype="multipart/form-data"๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
<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>
- ์ด Content-Type์ ์ฌ์ฉํ๋ฉด Form์์ ๊ฐ ๋ฐ์ดํฐ๋ค์ ๊ฐ๊ฐ์ Part๋ก ๋๋์ด์ ธ POST ์ ์ก ๋ฉ๋๋ค. ์๋ธ๋ฆฟ์์๋ part๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ณผ ์ ์์ต๋๋ค.
- ์ปจํธ๋กค๋ฌ์์ request.getParts()๋ฅผ ํตํด multpiart/form-data ์ ์ก ๋ฐฉ์์์ ๊ฐ๊ฐ ๋๋์ด์ง Part๋ฅผ ๋ฐ์์ ํ์ธํ ์ ์์ต๋๋ค.
+ Tip : application.properties์ ์ถ๊ฐํ๋ฉด HTTP ์์ฒญ ๋ฉ์์ง ๋ก๊ทธ๋ฅผ ํตํด ํ์ธ ๊ฐ๋ฅํฉ๋๋ค. ์ถ๊ฐ์ ์ผ๋ก ํผ์์ ์ ์ก๋ ๋ฉํฐํํธ์ ๊ฐ ํํธ์ ์ ๋ณด๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
logging.level.org.apache.coyote.http11=debug
+ application.properties์์ multipart์ ๋ํ ์ฒ๋ฆฌ ์ต์ ์ ๋๋ฉด ์๋ธ๋ฆฟ ์ปจํ ์ด๋๊ฐ multipart ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ต๋๋ค. ๋ํดํธ๋ true๋ก ์ค์ ๋์ด ์์ต๋๋ค.
spring.servlet.multipart.enabled=false
+ ์๋ธ๋ฆฟ์์ multipart์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ๋ ๊ฒฝ์ฐ์๋ RequestFacade๊ฐ ์๋ StandardMultipartHttpServletRequest๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๋ธ๋ฆฟ์ ์ด์ฉํ HTML Form ํ์ผ ์ ๋ก๋
์๋ธ๋ฆฟ์ ํตํด ๊ฐ๋จํ๊ฒ ํ์ผ์ ์๋ฒ์ ์ ๋ก๋ ํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
@Slf4j
@Controller
@RequestMapping("/servlet/v2")
public class ServletUploadControllerV2 {
@Value("${file.dir}")
private String fileDir;
@GetMapping("/upload")
public String newFile()
{
return "upload-form";
}
- file.dir์ ์ ๋ก๋ํ ๊ฒฝ๋ก๋ก application.properties์ ๋ฑ๋กํด์ ์ฌ์ฉํ์ต๋๋ค.
file.dir=/Users/kdo6301/Desktop/Files/
- upload-form์๋ form์ enctype="multipart/form-data"๋ฅผ ์ง์ ํด์ฃผ๊ณ ์ํ๊ณผ ํ์ผ์ ์ ๋ ฅํ ์ ์๋ ํผ์ ์์ฑํ์ต๋๋ค.
@PostMapping("/upload")
public String saveFileV2(HttpServletRequest request) throws ServletException, IOException
{
log.info("request = {}",request);
String itemName = request.getParameter("itemName");
log.info("itemName = {}",itemName);
Collection<Part> parts = request.getParts();
log.info("parts={}",parts);
for (Part part : parts) {
log.info("=== PART ===");
log.info("name={}",part.getName());
Collection<String> headerNames = part.getHeaderNames();
for (String headerName : headerNames) {
log.info("header {} : {}", headerName, part.getHeader(headerName));
}
// content-disposition ; filename
log.info("submittedFileName={}",part.getSubmittedFileName());
log.info("size={}",part.getSize());
// ๋ฐ์ดํฐ ์ฝ๊ธฐ
InputStream inputStream = part.getInputStream();
String body = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
// log.info("body={}",body);
// part๋ฅผ ํตํด ์ ์ก๋ ๋ฐ์ดํฐ ์ ์ฅ
if(StringUtils.hasText(part.getSubmittedFileName()))
{
String fullPath = fileDir + part.getSubmittedFileName();
log.info("ํ์ผ ์ ์ฅ fullPath = {}", fullPath);
part.write(fullPath);
}
}
return "upload-form";
}
- request.getParts()๋ฅผ ํตํด multpiart/form-data ์ ์ก ๋ฐฉ์์์ ๊ฐ๊ฐ ๋๋์ด์ง Part๋ฅผ ๋ฐ์์ ํ์ธํ ์ ์๋ค๊ณ ํ์ต๋๋ค.
- ํผ์ผ๋ก๋ถํฐ ์ ์ก๋ ๊ฐ ํํธ๋ฅผ iterator๋ก ๊ฐ ํํธ์ ๋ํ ์ ๋ณด(ํค๋)๋ฅผ ์ถ๋ ฅํ์ต๋๋ค.
- ํ์ผ ํ์์ธ ๊ฒฝ์ฐ (part.getSubmittedFileName() Not Null ) ํด๋น ํํธ๋ฅผ fullPath์ writeํด์ ์ ์ฅ
- part.write() : ํ์ผ ์ ์ฅ
- part.getSubmittedFileName() : ํด๋ผ์ด์ธํธ๊ฐ ์ ๋ฌํ ํ์ผ๋ช
- part.getInputStream() : Part์ ์ ์ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
์๋ธ๋ฆฟ์ด ์ ๊ณตํ๋ Part๋ฅผ ์ด์ฉํด์ ํ์ผ์ ์๋ฒ์ ์ ์กํด๋ณด์์ต๋๋ค. ํธํ๊ธด ํ์ง๋ง ์๋ธ๋ฆฟ ๊ฐ์ฒด๋ฅผ ์จ์ผ ํ๊ณ , ์ถ๊ฐ๋ก ํ์ผ ๋ถ๋ถ๋ง ๊ตฌ๋ถํ๊ธฐ ์ํ ์กฐ๊ฑด์ด ์ข ๊น๋ค๋กญ์ต๋๋ค. ์คํ๋ง์ด ์ด ๋ถ๋ถ์ ์ผ๋ง๋ ํธ๋ฆฌํ๊ฒ ์ ๊ณตํด์ฃผ๋์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์คํ๋ง์ ์ด์ฉํ HTML Form ํ์ผ ์ ๋ก๋
์คํ๋ง์ MultiPartFile ์ด๋ผ๋ ์ธํฐํ์ด์ค๋ก ๋ฉํฐํํธ ํ์ผ์ ๋งค์ฐ ํธ๋ฆฌํ๊ฒ ์ง์ํฉ๋๋ค.
@PostMapping("/upload")
public String saveFile(@RequestParam String itemName,
/* @ModelAttribute๋ ๊ฐ๋ฅ*/
@RequestParam MultipartFile file, HttpServletRequest request)
throws IOException
{
log.info("request = {}",request);
log.info("itemName = {}",itemName);
log.info("file = {}",file);
if(!file.isEmpty())
{
String fullPath = fileDir + file.getOriginalFilename();
log.info("ํ์ผ ์ ์ฅ fullPath = {}",fullPath);
file.transferTo(new File(fullPath));
}
return "upload-form";
}
POST ๋ก HTML ํผ ์ ์ก ์ ํ์ผ์ ๋ํ ํ์ ์ MultiPart๋ก ์ง์ ํ๋ฉด @RequestParam์ด๋ @ModelAttribute๋ก ๋ฐ์ ์ ์์ต๋๋ค.
์๋ธ๋ฆฟ๊ณผ ๋น๊ตํ๋ฉด ์ฐธ ์ฝ๊ณ ๊ฐ๋จํ์ฃ ?
MultiPartFile์ ์ฃผ์ ๋ฉ์๋
- getOriginalFilename() : ์ ๋ก๋ ํ์ผ ๋ช
- transferTo(File) : ํ์ผ ์ ์ฅ
<์ฐธ๊ณ ์๋ฃ>
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
'๐ Backend > MVC Pattern' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
MultiPartFile์ ์ด์ฉํ ํ์ผ ์ ๋ก๋, ๋ค์ด๋ก๋ (0) | 2023.03.30 |
---|---|
ํฌ๋งทํฐ(Formatter) (0) | 2023.03.29 |
ํ์ ์ปจ๋ฒํฐ(Type Converter) (0) | 2023.03.29 |
API์์์ ์์ธ ์ฒ๋ฆฌ (0) | 2023.03.28 |
Spring - ์๋ธ๋ฆฟ ์์ธ ์ฒ๋ฆฌ ( Exception ) (0) | 2023.03.28 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422