스프링, 스프링부트에서의 자주 사용되는 파일 업로드에 대한 내용 입니다.
프로그램 개발을 하다 보면 파일 업로드 / 다운로드와 관련된 일을 자주 하는 경우가 있습니다.
업로드인 경우에는 주로 멀티파트의 객체에서 값을 가져와 반복문(itor)을 통하여 파일을 다른 경로에 저장하고, 해당 결과 값을 받도록 만들어 줍니다.
이를 좀 더 간단하고 비지니스 성격의 기능을 단순화 할 수 없을까에 대해서 접근하여 보았습니다.
먼저 파일과 관련된 정보를 담는 빈(Bean)형식의 클래스를 만들어 줍니다.
* 파일 이름 : FileVo
public class FileVo {
private String filePath;
private String fileRealName;
private String fileConvName;
private long fileLength;
public FileVo() {
}
public FileVo(String filePath, String file_real_name, String file_conv_name, long file_length) {
this.filePath = filePath;
this.fileRealName = file_real_name;
this.fileConvName = file_conv_name;
this.fileLength = file_length;
}
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public String getFileRealName() {
return fileRealName;
}
public void setFileRealName(String fileRealName) {
this.fileRealName = fileRealName;
}
public String getFileConvName() {
return fileConvName;
}
public void setFileConvName(String fileConvName) {
this.fileConvName = fileConvName;
}
public long getFileLength() {
return fileLength;
}
public void setFileLength(long fileLength) {
this.fileLength = fileLength;
}
}
해당 클래스에는 파일과 관련된 내용이 저장이 될 예정 입니다.
다음으로는 파일을 처리하는 클래스를 구상하여 봅니다.
일반적으로 파일과 관련된 값을 받을 때 MultipartHttpServletRequest 클래스나 MultipartFile 클래스 형태로 요청값을 받아서 처리를 합니다.
파일 처리를 위해 자바의 다형성, 오버로딩을 위해서 메소드이름은 1개로 만들어 봅니다.
* 파일 이름 : FileSaver
import java.io.File;
import java.util.List;
import java.util.stream.Collectors;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
public class FileSaver {
/**
* MultipartHttpServletRequest 객체에서 파일 목록을 저장하는 메소드 입니다.<br>
* 파라미터 : 대상, 저장경로, 변환된 파일 이름앞에 붙일 내용 입니다.
* */
public static List<FileVo> CONVERT(MultipartHttpServletRequest filelist, String path, String preFixName) {
if(filelist != null) {
return filelist.getFileMap().entrySet().stream() //스트림을 통해 간단하게 처리 합니다.
.filter( arg-> arg != null)
.map( (entry)->CONVERT(entry.getValue(), path, preFixName))
.collect(Collectors.toList());
}
return null;
}
/**
* MultipartFile 객체에서 파일을 저장하는 메소드 입니다.<br>
* 파라미터 : 대상, 저장경로, 변환된 파일 이름앞에 붙일 내용 입니다.
* */
public static FileVo CONVERT(MultipartFile file, String path, String preFixName) {
if(file == null) return null;
String ext = FilenameUtils.getExtension(file.getOriginalFilename());
String convFileName = preFixName + System.currentTimeMillis() + "." + ext;
File changeFile = new File(path + convFileName);
try {
file.transferTo(changeFile);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return new FileVo(path, file.getOriginalFilename(),convFileName, changeFile.length());
}
}
이를 사용하는 컨트롤러를 예를 들어 보겠습니다.
@RequestMapping(value = "/주소",method = RequestMethod.POST)
@ResponseBody
public String fileUpload(@RequestParam HashMap<Object, Object> param, MultipartHttpServletRequest filelist) {
//param은 일반 파라미터
//MultipartHttpServletRequest은 파일
FileSaver.CONVERT(filelist, "/저장경로/", "board");
return "OK!";
}
매우 쉽게 파일저장과 관련된 행위를 처리한 것을 볼 수 있습니다.
만약 여기서 저장과 관련된 행위를 좀 더 유연하게 한 다면 함수를 활용하면 좋을 것 같습니다.
반응형
'Spring framework' 카테고리의 다른 글
Mybatis MyBatisSystemException PersistenceException (0) | 2021.09.08 |
---|---|
전자정부(이클립스) 톰캣 10 구동(Eclipse run tomcat 10) (4) | 2021.08.04 |
Spring RSS Feed 기능 만들기(전자정부 RSS Feed) (0) | 2021.05.31 |
Spring RequestBody, RequestParam의 컨트롤러(Controller) (0) | 2020.12.07 |
Spring RequestBody RequestParam(스프링 RequestParam RequestBody) (0) | 2020.11.17 |
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)
댓글