Back_end/Spring

Spring - 파일 업로드(multipart)

hyeon1016 2024. 11. 19. 12:19

What

multipart를 활용하여 뷰에서 파일을 서버로 업로드하여 저장하는 기능이다.

* 텍스트 파일, 이미지 파일, 문서 등 다양한 종류의 파일을 서버로 전송하고 관리할 수 있다.

 

Why

사용자로 부터 파일을 받아 서버에 저장하고 처리하기 위해 사용한다.

 * 프로필 사진, 게시글 이미지, 첨부 파일 등등

서버에 파일을 저장하면 데이터를 중앙에서 관리하고 필요할 때 재사용하기 좋다.

 

How

의존성 추가

pom.xml

파일 업로드를 처리하기 위한 commons-fileupload, commons-io 의존성 추가

<!-- 파일 업로드 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

 

객체 생성

servlet-context.xml에서 CommonsMultipartResolver 객체를 생성한다.

<!-- 파일 업로드 객체 생성-->
            <!-- 참조변수 -->
<beans:bean id="multipartResolver" 
         class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 클래스 -->
  <!-- 생성자의 파라미터로 사용할 변수 -->
  <!-- 업로드 파일의 최대 크기를 설정 -->
  <beans:property name="maxUploadSize" value="10000000000000"/>
</beans:bean>

 

사용방법

- @RequestParam으로 받아 업로드 하는 것과 @ModelAttribute로 받아 업로드하는 방식이 있다.

 

View

파일 업로드를 위한 폼 페이지 작성

*전송방식은 데이터 크기의 제한과 보안상 이유로 반드시 POST 방식으로 설정해야 한다.

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file" id="file">
    <button type="submit">업로드</button>
</form>

 

Controller

@PostMapping("/upload")
public String uploadFile(
        @RequestParam("file") MultipartFile file, 
        HttpServletRequest request) {
    //1. 파일 이름 만들기
    String saveName = file.getOriginalFilename();
    String savePath = request.getServletContext().getRealPath("/resources/img");

    //2. 빈 파일 생성
    File destinationFile  = new File(savePath, saveName);

    //3. 생성한 파일에 내용 작성
    if(file!=null && !file.isEmpty()) {
        try {
            file.transferTo(destinationFile);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            throw new RuntimeException("이미지 업로드에 실패했습니다.", e);
        }
    }

    return "uploadResult";
}

 

MultipartFile

스프링 프레임워크에서 제공하는 인터페이스로 HTTP 요청을 통해 전송된 파일을 다루며 파일 내용에 접근할 수 있다.

메서드 반환타입 설명
getName() String multipart 폼에서 파라미터의 이름을 반환
getContentType() String 파일의 콘텐츠 형식을 반환
getOriginalFilename() String 파일의 실제 이름을 반환
isEmpty() boolean 업로드한 파일이 있는지 반환
getSize() long 바이트의 파일 크기를 반환
getBytes() byte[] 바이트의 배열로 파일 내용을 반환
getInputStream() InputStream 파일 폼의 내용을 읽어 반환
transferTo(File dest) void 수신된 파일을 지정한 대상 파일에 전송

 

 

View

<h3>파일 업로드에 성공했습니다.</h3>