대용량 파일 업로드

Home > 기본 예제 > 예제 14

설명

대용량 파일 업로드는 개별 파일이 2GB가 넘더라도 전송할 수 있는 기능이다. 이와 달리, 업로드할 총 파일의 크기(기타 데이터 포함)가 2GB가 넘지 않는다면 굳이 대용량 파일 업로드를 사용할 필요 없다.

일반 업로드의 경우 10개의 파일 있을 때, ORAF는 한 번의 전송으로 10개의 파일을 모두 전송하며, OROF 모드로 업로드를 하면, 개별 전송이기 때문에 10회 전송한다. 이와 달리 대용량 파일 업로드는 OROF처럼 개별 파일마다 전송을 할 뿐만 아니라 개별 파일을 정해진 크기로 나눈 청크(블록) 단위로 서버에 전송하기 때문에, 최소 20회 이상의 전송 작업이 필요하다.

// 파일 업로드를 처리할 경로를 설정한다.
dx.setUploadURL("http://domain/path/upload-extension");

// 대용량 파일 업로드 방식을 사용하려면 EXTS로 설정한다.
dx.setUploadMode("EXTS");

// 파일을 쪼갤 블록 크기를 byte 단위로 설정한다.
dx.setUploadBlockSize(10 * 1024 * 1024);

DEXTUploadX5는 파일을 보내는 sender 역할을 수행한다. 이와 달리 DEXTUploadJK는 서버 측에 파일을 받는 receiver 역할을 담당한다.

쪼개진 파일을 하나로 합쳐 서버에 임시 파일을 생성하는 것은 JKSpringExtensionUploadFilter가 담당하며, 임시파일이 생성되면 FileServiceController로 전달한다.

# Server side
# 만일 총 10개의 파일을 전송한다면, 매핑 메소드는 총 10번 호출된다.

@PostMapping(value = "/upload-extension", produces = "text/plain;charset=UTF-8")
@ResponseBody
public String uploadExtension(DEXTUploadX5Item item) {
		
    FileItem fileItem = (FileItem)item.getFileData();
    fileItem.save();
	...
}

임시 파일의 크기가 매우 클 수 있으므로 FileItem 인터페이스의 save 메소드를 사용하여 원하는 위치로 저장하는 과정은 매우 느릴 수 있다. 이런 이유는 서버에서 용량이 큰 파일이 대상 위치로 저장하는 과정이 '복사' 작업을 통해서 이루어지기 때문이다. 만일 임시 파일이 생성되는 위치와 최종적으로 저장할 위치가 같은 파티션이라면 '복사'가 아닌 '이동'이 되므로 빠르게 처리할 수 있다.

예제