본문 바로가기
공부/Spring

[Spring][인프런 스프링 MVC] 파일 업로드 및 저장 방법

by 웅대 2023. 3. 20.
728x90
반응형

본 포스팅은 김영한 강사님의 인프런 강의 "스프링 MVC 1편"을 정리한 포스팅입니다.

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com

 

프로젝트를 진행하다보면 클라이언트가 단순 문자, 숫자가 아닌 이미지나 동영상 파일들을 보내는 경우가 종종 있다.

 

이렇게 이미지나 동영상과 같은 파일들을 서버에서 받아서 저장하는 방법에 대해서 포스팅해보려 한다.

 

정수, 문자와 달리 파일을 보낼 때는 바이너리 데이터를 보내야 한다.

 

정수, 문자와 바이너리 데이터를 같이 보낼 때는 일반적인 html form 방식으로는 해결하기 어렵다.

 

그래서 multipart/form-data 방식을 사용해야한다.

 

다음과 같은 html 파일을 생성한다.

<file.html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="file" method="post" enctype="multipart/form-data">
        <input type="text" name="name">
        <input type="file" name="file">
        <button type="submit">제출</button>
    </form>

</body>
</html>

form 태그의 속성에 enctype="multipart/form-data"를 넣어줘야 제대로 동작한다.

 

그리고 이 html 파일을 보여주기 위한 컨트롤러를 생성한다. (이 포스팅에서는 템플릿 엔진으로 타임리프를 사용한다.)

 

<FileCotroller>

@Controller
public class FileController {
    @GetMapping("/file")
    public String getFileForm() {
        return "file";
    }

}

그리고 파일을 업로드할 때 너무 큰 파일을 업로드하면 수용 가능 용량을 넘어설 수 있다.

 

그래서 다음과 같이 application.properties에 파일 용량을 제한한다.

spring.servlet.multipart.max-file-size=1MB //파일 하나 용량
spring.servlet.multipart.max-request-size=10MB //파일이 여러 개면 총 파일 용량

용량을 넘어서면 SizeLimitExceededException 예외가 발생한다.

 

이제 파일을 받아서 등록하는 로직을 짜야 한다.

서블릿

우선 서블릿을 이용하는 방법이다.

 

HttpServletRequest의 getParts 메소드를 사용하여 모든 파일들의 정보를 가져올 수 있다.

 

@ResponseBody
@PostMapping("/file")
public String registerFileForm(HttpServletRequest request) throws ServletException, IOException {
    Collection<Part> parts = request.getParts();

    String fileDir = "/C:/files/";
    for (Part part : parts) {
        part.write(fileDir + part.getSubmittedFileName());
    }
    return "ok";
}

이후 반복문으로 하나씩 돌면서 part.write의 인자로 파일 경로를 넣어주면 해당 파일 위치로 파일이 저장된다.

 

파일을 선택 후 제출하면 해당 위치에 파일이 저장된 모습을 확인할 수 있다.

 

다음은 서블릿이 아닌 스프링에서 파일 업로드 및 저장을 구현하는 방법이다.

 

스프링

크게 어렵지는 않다. 파일의 타입은 MultipartFile로 해두고 그냥 html-form 방식과 동일하게 구현하면 된다.

 

일단 file-spring.html 파일을 생성한다.

 

<file-spring.html >

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="file-spring" method="post" enctype="multipart/form-data">
        <input type="text" name="name">
        <input type="file" name="file">
        <button type="submit">제출</button>
    </form>

</body>
</html>

컨트롤러에 다음 메소드들을 추가한다.

@GetMapping("/file-spring")
public String getSpringFileForm() {
    return "file-spring";
}
@ResponseBody
@PostMapping("/file-spring")
public String registerFileForm(
        @RequestParam String name,
        @RequestParam MultipartFile file
        ) throws IOException {

    String fileDir = "/C:/files/";
    file.transferTo(new File(fileDir + file.getOriginalFilename()));
    return "ok";
}

역시 서블릿을 사용한 방식과 동일하게 동작한다.

 

@RequestParam을 사용하지 않고 아래와 같이 @ModelAttribute를 사용해도 된다.

 

//form
@Data
public class Form {
    private String name;
    private MultipartFile file;
}
@ResponseBody
@PostMapping("/file-spring")
public String registerFileForm(@ModelAttribute Form form) throws IOException {
    MultipartFile file = form.getFile();
    String fileDir = "/C:/files/";
    file.transferTo(new File(fileDir + file.getOriginalFilename()));
    return "ok";
}

 

728x90
반응형

댓글