본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Spring framework

Spring 자주 사용되는 비지니스 로직, 컨트롤러 파일 업로드(Spring file upload, contoller)

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2021. 6. 3.

 

스프링, 스프링부트에서의 자주 사용되는 파일 업로드에 대한 내용 입니다.

프로그램 개발을 하다 보면 파일 업로드 / 다운로드와 관련된 일을 자주 하는 경우가 있습니다.

업로드인 경우에는 주로 멀티파트의 객체에서 값을 가져와 반복문(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!";
    }	

 

매우 쉽게 파일저장과 관련된 행위를 처리한 것을 볼 수 있습니다.

만약 여기서 저장과 관련된 행위를 좀 더 유연하게 한 다면 함수를 활용하면 좋을 것 같습니다.

 

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글