상세 컨텐츠

본문 제목

[Spring 1팀] 7장. 파일 업로드 처리

25-26/Spring

by soyee_ 2025. 11. 14. 10:00

본문

728x90


1. 파일 업로드

  • 파일 업로드 : 파일을 웹 브라우저 -----> 서버로 전송

1) 파일 업로드 설정

application.properties 파일 설정

spring.servlet.multipart.enabled=true 
spring.servlet.multipart.file-size-threshold=2KB 
spring.servlet.multipart.location=C:/upload 
spring.servlet.multipart.max-file-size=200MB  
spring.servlet.multipart.max-request-size=215MB

 

2) 파일 업로드 웹 페이지

  • 폼 태크 사용
  • method 는 POST
  • enctype 는 multipart/form-data
  • action 는 실행 파일
  • input 태그의 type 속성은 file
  • 파일 업로드 수만큼 input 태크 사용
<form action ="./form"  method="post" enctype="multipart/form-data">
		<p>	제목 : <input type="text" name="title"> 		
		<p> 파일 : <input type="file" name="fileName">	
		<p> <input type="submit" value="submit">		
</form>

 

3) 정적 리소스 위치 설정

  • ResourceHttpRequestHandler 클래스 : 정적 리소스 쉽게 처리가능
  • ResourceHandlerRegistry : 정적 리소스가 저장된 WAR, 파일 시스템 접근
@Configuration
public class ResourceConfig implements WebMvcConfigurer {	
	
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
	    registry.addResourceHandler("/images/**")	 // 외부 연결 uri 경로 설정
	    .addResourceLocations("file:///C:/upload/"); // 리소스가 위치한 실제 경로 설정. 하위의 리소스 반환
	   
	}
}

 

2. MultipartFile

  • MultipartFile 인터페이스 : 컨트롤러에 멀트 파트 요청으로 들어오는 매개변수 중에서 업로드된 파일과 파일 데이터를 표현
  • 주요 메서드

  • 파일 업로드 유형 : MultipartHttpServletRequest, @RequestParam, @ModelAttribute

1) MultipartHttpServletRequest

  • HttpServletRequest, MultipartRequest 인터페이스 상속 필요
  • HttpServletRequest( -> getParameter() 메서드 이용), MultipartRequest( -> getFile() 메서드 이용)
<html>
<head>
<title>Chap07</title>
</head>
<body>
	<h3>파일업로드</h3>
	<form action ="./form"  method="post" enctype="multipart/form-data">
		<p>이름 : <input type="text"  name="name"/> 		
		<p>파일 : <input type="file" name="fileImage"/> 	// 파일 출력	
		<p><input type="submit" value="전송하기"/> 
		   <input type="reset"  value="다시쓰기"/>			
	</form>
</body>
<html>
<html>
<head>
<title>Chap07</title>
</head>
<body>
	<h3 th:text="${data1}"></h3>
	<p >실제 파일 이름: <span th:utext="${data2}"/>
	<p> 서버 파일 이름 : <span th:utext="${data3}"/>
	<p><img th:src="'/images/'+${data3}" width="100" />	
</body>
<html>
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class ResourceConfig implements WebMvcConfigurer {	
	
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
	    registry.addResourceHandler("/images/**")    // /images/로 시작하는 요청이 들어왔을 때 처리
	    .addResourceLocations("file:///C:/upload/"); // 윈도우에서 실제 파일 경로
	   
	}
}

 

2) @RequestParam

  • @ RequestParam이 적용된 MultipartFile 타입의 매개변수 사용
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

@Controller
@RequestMapping("/exam02")
public class Example02Controller {

	
	@GetMapping("/form")
	public String requestForm() {
		return "viewPage";
	}

	@PostMapping("/form")
	public String submitForm(@RequestParam("name") String name,	
                              @RequestParam("fileImage") MultipartFile file, Model model) {
                              // 업로드 파일을 MultipartFile 타입으로 받음
		String filename = file.getOriginalFilename();
		File saveFile = new File("c:\\upload\\" + name + "_" + filename);           
		
		try {
			file.transferTo(saveFile); //파일 업로드
			
			model.addAttribute("data1","@RequestParam 예졔" ); // 업로드 후 결과 전달		
			model.addAttribute("data2",filename);
			model.addAttribute("data3", saveFile.getName() );
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "viewPage_process";
	}
}

 

3) @ModelAttribute

  • MultipartFile 타입의 멤버 변수 추가 (요청 매개변수와 동일한 이름)
  • @ModelAttribute 를 선언
import org.springframework.web.multipart.MultipartFile;

import lombok.Data;
@Data
public class Member {
	 private String name;
	 private MultipartFile fileImage; // 요청 매개변수와 동일한 이름으로 선언

}
import org.springframework.web.multipart.MultipartFile;
import com.springboot.domain.Member;

@Controller
@RequestMapping("/exam03")
public class Example03Controller {
	
	@GetMapping("/form")
	public String requestForm(Member member) {
		return "viewPage";
	}

	@PostMapping("/form")
	public String submitForm(@ModelAttribute Member member, Model model){	
        String name = member.getName(); // 파일 이름
        MultipartFile file = member.getFileImage(); // 파일 이미지
        
        String filename = file.getOriginalFilename();  
        File saveFile = new File("c:\\upload\\" + name + "_" + filename);  
        try {
        	file.transferTo(saveFile); // 파일 업로드
        	
        	model.addAttribute("data1","@ModelAttribute 예졔" );
			model.addAttribute("data2",filename);
			model.addAttribute("data3", saveFile.getName() );
			
        }catch (IOException e) {            
            e.printStackTrace();
        }
		return "viewPage_process";
	}
}

빈칸 Quiz

1. 파일을 업로드할 때, 웹 페이지에서는 (      ) 태크를 이용한다.

2. 파일 업로드를 할 때 사용하는 인터페이스는 (             ) 이다. 

3. 정적 리소스는 (                   ) 클래스로 쉽게 처리 가능하다.

4. 폼 태그의 method 속성은 (            ) 를 반드시 사용한다.

5. MutipartFile 인터페이스와 함께 (              ), (                ) 에너테이션을 사용하여 업로드한 파일을 전달받을 수 있다.

 

답: 

1. 폼(form)

2. MultipartFile

3. ResourceHttpRequestHandler

4. POST

5. @RequestParam, @ModelAttribute

코드 Quiz

1. 빈칸에 들어갈 코드는?

답: @RequestParam, MultipartFile

@Controller
@RequestMapping("/exam02")
public class Example02Controller {

	
	@GetMapping("/form")
	public String requestForm() {
		return "viewPage";
	}

	@PostMapping("/form")
	public String submitForm(@RequestParam("name") String name, //		
                              ____________("fileImage") _____________ file, Model model) {
		String filename = file.getOriginalFilename();
		File saveFile = new File("c:\\upload\\" + name + "_" + filename);           
		
		try {
			file.transferTo(saveFile); //파일 업로드
			
			model.addAttribute("data1","@RequestParam 예졔" );			
			model.addAttribute("data2",filename);
			model.addAttribute("data3", saveFile.getName() );
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "viewPage_process";
	}
}

 

2. 빈칸에 들어갈 코드는?

답: MultipartFile

@Controller
@RequestMapping("/exam03")
public class Example03Controller {
	
	@GetMapping("/form")
	public String requestForm(Member member) {
		return "viewPage";
	}

	@PostMapping("/form")
	public String submitForm(@ModelAttribute Member member, Model model){	
        String name = member.getName(); // 파일 이름
        ____________ file = member.getFileImage(); // 파일 이미지
        
        String filename = file.getOriginalFilename();  
        File saveFile = new File("c:\\upload\\" + name + "_" + filename);  
        try {
        	file.transferTo(saveFile); // 파일 업로드
        	
        	model.addAttribute("data1","@ModelAttribute 예졔" );
			model.addAttribute("data2",filename);
			model.addAttribute("data3", saveFile.getName() );
			
        }catch (IOException e) {            
            e.printStackTrace();
        }
		return "viewPage_process";
	}
}

 


출처: 송미영, 스프링 부트 완전 정복 , 길벗(2024), p203-235.

Coner Spring1

Editor: soyee

728x90

관련글 더보기