Spring

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

jane.dev 2021. 10. 11. 23:14
반응형
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 요청으로 받아 업로드된 파일을 표현하는 것으로, 파일의 내용은 메모리에 저장됨