본문 바로가기

STUDY/Spring

Spring | 파일 업로드 ( + Spring Security )

1. 파일 업로드를 위한 dependency 추가

 

commons-fileupload, commons-io

 

 

Maven Repository: Search/Browse/Explore

Collect base useful tools for dev. Last Release on Jul 3, 2020

mvnrepository.com

<!-- file upload -->
<dependency>
  <groupId>commons-fileupload</groupId>
  <artifactId>commons-fileupload</artifactId>
  <version>1.3.3</version>
</dependency>

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

 

 

 

2. root-context.xml에 mutilpartResolver설정

 

따로 파일 만들어서 등록해주는 것도 가능

 

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <property name="maxUploadSize" value="104857600"/>
  <property name="maxInMemorySize" value="102400"/>
  <property name="defaultEncoding" value="utf-8"/>
</bean>

 

 

3. form작성

 

method="post"와 enctype="multipart/form-data"필수 지정

 

스프링 시큐리티를 사용할 경우 action경로 뒤에 csrf토큰을 입력. (multipart/form-data로 전송할 경우에만)

${_csrf.parameterName}=${_csrf.token}

 

<form action="컨트롤러경로?${_csrf.parameterName}=${_csrf.token}" method="post" enctype="multipart/form-data">
	
    <input type='file' name="file"/>
	
    <input type="text" name="title" placeholder="제목" />
		
        <!-- 생략 -->
        
	<input type="submit" value="저장" />
    
</form>

 

 

 

3. 컨트롤러 작성

 

MultipartHttpServletRequest를 통해 파일에 접근 가능

 

@PostMapping("/write-processing")
public String writePrecessing(ReviewDto reviewDto, 
		MultipartHttpServletRequest mtf) throws Exception{

  // 파일 태그 name
  String fileTag = "file";

  // 업로드 파일이 저장될 경로
  String filePath = "C:\\경로설정";

  // 파일 얻기
  MultipartFile file = mtf.getFile(fileTag);

  if(file.isEmpty()) {
  	// 파일 업로드 하지 않은 경우 처리
  }else {
  
  	String fileName = file.getOriginalFilename();

    try {
    	// 파일 업로드 처리
    } catch(Exception e) {
    	// 오류 발생 
    }
  }

  return "redirect:/";
}

 

@RequestParam으로 받는 것도 가능

@RequestParam("태그네임") MultipartFile ~

@PostMapping("/write-processing")
public String writePrecessing(ReviewDto reviewDto, 
		@RequestParam("file") MultipartFile file) throws Exception{
	
    // 컨트롤러 처리

	return "redirect:/";
}

 

 

 

+) 파일 저장하기

commons-io와 FileUtils를 사용하여 간단하게 저장

 

이 방법 외에도 transferTo를 이용해 저장하는 것도 가능

public static void saveFile(MultipartFile uploadFile) {

  String originalFileName = uploadFile.getOriginalFilename();
  String fileExtention = getFileExtention(originalFileName);

  String newFileName = getNewFileName() + fileExtention;

  File file = new File(PATH_STRING + "/" + newFileName);
  // File file = new File( PATH_STRING , newFileName ); 동일한 결과

  try {
  	FileUtils.writeByteArrayToFile(file, uploadFile.getBytes());
  } catch (Exception e) {
  	e.printStackTrace();
  }

}

 

 

 

+) 결과

설정한 경로에 업로드 된 모습