본문 바로가기
Spring

[Spring] form 태그를 이용한 파일 업로드

by jane.dev 2021. 10. 11.
반응형
form 태그로 파일을 업로드하는 방식은 페이지 이동과 동시에 이루어짐
Get 방식으로 폼에서 업로드할 파일을 받아, Post 방식으로 처리

 

첨부 파일 처리에 대한 설정은 web.xml에서 함(업로드에 대한 Tomcat 자체 설정)

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

 

<servlet> 태그 내부에 <multipart-config> 태그를 추가

<servlet>
...

    <multipart-config>
        <!-- 파일이 업로드되면 저장될 경로 -->
        <location>C:\\upload\\temp</location>
        <!-- 업로드되는 파일의 최대 크기 -->
        <max-file-size>20971520</max-file-size><!-- '1MB * 20'를 byte 단위로 작성 -->
        <!-- 한번에 업로드할 수 있는 최대 크기 -->
        <max-request-size>41946040</max-request-size><!-- '40MB'를 byte 단위로 작성 -->
        <!-- 특정 사이즈의 메모리 사용 -->
        <file-size-threshold>20971520</file-size-threshold><!-- '20MB'를 byte 단위로 작성 -->
    </multipart-config>  
</servlet>

 

파일 업로드 처리를 위한 Controller 작성 - GET 방식

@Controller
@Log4j
public class UploadController{
    
    @GetMapping("/uploadForm")
    public void uploadForm(){
        log.info("form 접근");
    }
    
}

 

/uploadForm으로 접속하면 form에 접근할 수 있도록 views 폴더 아래 uploadForm.jsp 작성 

<body>
    <form action="/uploadFormAction" method="post" 
        enctype="multipart/form-data"><!-- 파일을 전송받아야하기 때문에 추가 -->
        <input type="file" name="uploadFile" 
            multiple /><!-- 하나의 input 태그로 여러개의 파일을 업로드할 수 있게 하는 속성  -->
        <button>upload</button>
    </form>
</body>

간단하게 <form> 태그 내부에 업로드할 파일을 받을 <input> 태그만 생성

2021.10.10 - [Spring] - [Spring] 파일 업로드를 위한 form 태그 내부에 작성하는 enctype="multipart/form-data"의 의미

 

[Spring] 파일 업로드를 위한 form 태그 내부에 작성하는 enctype="multipart/form-data"의 의미

태그에서 POST 요청 시 데이터 인코딩이 필요한데, html에서는 세가지의 인코딩 방법을 제공함 application/x-www-form-urlencoded(default 값) application/x-www-form-urlencoded은 모든 문자들을 서버로 전송하..

wheneveryouwantsz.tistory.com

 

Controller에 POST 방식 작성

@PostMapping("/uploadFormAction")
// 파일이 여러개 업로드 될 수 있기 때문에 배열로 uploadFile을 받음
public void uploadFormPost(MultipartFile[] uploadFile, Model model){
	
    // web.xml에서 지정한 경로와 같은 경로를 작성해 파일이 업로드되면 해당 폴더에 저장_해당 폴더를 생성해야함
    String uploadFolder = "C:\\upload_data\\temp";
    
    // MultipartFile의 내부 메서드를 이용해 파일의 이름과 크기를 로그로 작성
    log.info("파일 이름: " + multipartFile.getOriginalFilename());
    log.info("파일 크기: " + multipartFile.getSize());
    
    // 반복문을 통해 여러개의 uploadFile을 multipartFile에 저장
    for(MultipartFile multipartFile : uploadFile){
        // 저장된 파일의정보(저장되는 위치, 업로드되는 파일의 이름)
        File saveFile = new File(uploadFolder, multipartFile.getOriginalFilename());
        
        try{
            // transferTo() 메서드로 파일을 저장, 파라미터로는 File 객체를 받음
            multipartFile.transferTo(saveFile);
        }catch(Exception e){
            log.error(e.getMessage());
        }
    
    }
}

MultipartFile 인터페이스:  multipart 요청으로 받아 업로드된 파일을 표현하는 것으로, 파일의 내용은 메모리에 저장됨