파일 다운로드

Home > 기본 예제 > 예제 04

설명

다운로드란, 대상을 HTTP GET으로 요청했을 때, 서버에서 보내는 응답 데이터가 브라우저 또는 외부 플러그인에서 열리지 않고, 바로 디스크에 파일로 저장되는 것을 말한다.

일반적으로 다운로드할 대상이 브라우저가 해석할 수 없는 형식인 경우, 특이 사항이 없는 이상 브라우저는 대상을 첨부 파일처럼 다운로드한다.

그러나 jpg 확장자를 갖는 이미지 파일처럼 해석할 수 있는 파일이라면 대상은 다운로드가 되지 않고, 브라우저 창을 통하여 출력된다. (DEXTUploadX5에서는 구조상 출력되는 대상이 감춰짐.)

대상을 열지 않고 바로 다운로드하려면 브라우저 자체 기능(컨텍스트 메뉴 - 다른 이름으로 저장)에 의존하거나 서버에서 응답 데이터를 보낼 때, 브라우저가 강제로 다운로드 하도록 지시하는 응답 헤더(Content-Disposition: attachment)를 실어 보내야 한다.

DEXTUploadX5는 웹브라우저의 기술을 그대로 사용하기 때문에, 다운로드 되지않고 파일이 그대로 열릴 수 있다. 그러므로 파일을 일관되게 다운로드하기 위해서는 서버나 DEXTUpload Pro와 같은 서버 파일 업/다운로드 컴포넌트를 사용해서, 파일을 열리지 않고 다운로드 될 수 있도록 응답 헤더를 설정해야 한다.

이 샘플은 common-download.asp 페이지에서 파일 다운로드를 처리한다.

샘플은 IIS Express 를 사용하여 구동되는데, DEXTUpload Pro를 사용하여 다운로드를 처리하면 오류가 발생한다. 그러므로 파일 다운로드와 열기를 테스트하려면 샘플을 IIS Express가 아닌 로컬 IIS 혹은 외부 서버에 직접 올려 테스트해야 한다.

# 서버 측 설정이다.
...
Session.CodePage = CStr(UTF8_CODEPAGE)
Response.CharSet = UTF8_CHARSET
Response.Clear()
dim fs, file, oDextpro, defaultFolder, key
	
key = GetQueryString("key", "", true)
defaultFolder = Request.ServerVariables("APPL_PHYSICAL_PATH") & "files\store\"
set fs = Server.CreateObject("Scripting.FileSystemObject")
'다운로드하고자 하는 대상을 설정한다.
if key = "FID0001" then
  set file = fs.GetFile(defaultFolder & "서강대교_509147.jpg")
elseif key = "FID0002" then
  set file = fs.GetFile(defaultFolder & "우도해변_239826.jpg")
elseif key = "FID0003" then
  set file = fs.GetFile(defaultFolder & "코스모스 (빈공간) 195779.jpg")
else
  set file = nothing
end if
set fs = nothing
if file is nothing then
  Response.AppendToLog("Downlod file not found")	
  Response.Status = HTTP_FILE_NOT_FOUND_ERR
else
  'DEXTUpload Pro FileDownload 객체 생성
  set oDextpro = Server.CreateObject("DEXT.FileDownload")
  '파일 다운로드를 시작한다.
  '다국어 처리를 위해서 파일명을 인코딩해줘야 한다.
  oDextpro.Download file.Path, Replace(Server.UrlEncode(file.Name), "+", "%20"), true, false
  set file = nothing
  set oDextpro = nothing
  '이 뒤로는 Response.Write를 사용하여 다른 값을 출력하면 안된다.
end if
...

DEXTUploadX5는 단일 파일 다운로드와 제한적 다중 파일 다운로드(1.1.0.0 버전 이후부터)를 지원한다.

스크립트에서 개별 파일을 다운로드하려면 downloadById, download 함수를 사용한다.

다중 파일 다운로드를 하려면 download 함수의 두 번째 파라미터 값을 true로 설정한다.

다운로드 가능한 대상은 반드시 downUrl 속성 값을 가지고 있는 가상 파일이어야 한다.

var dx = dx5.get("컴포넌트 아이디");
// downUrl 속성에 다운로드 웹 경로가 존재해야 한다.
dx.addVirtualFile({ ... name: "서강대교_509147.jpg", downUrl: "http://.../service/common-download.ashx?key=FID0001" });
// 가상 파일의 고유 아이디를 사용하여 단일 파일 다운로드를 수행한다.
dx.downloadById("다운로드할 가상 파일의 고유 아이디");
// 플래그 값에 따라 단일 파일 다운로드를 수행한다.
// AUTO: 첫 번째 가상 파일을 다운로드한다.
// SELECTED: 선택된 대상 중에 첫 번째 가상 파일을 다운로드한다.
// CHECKED: 체크된 대상 중에 첫 번째 가상 파일을 다운로드한다.
dx.download("SELECTED");	
// 플래그 값에 따라 다중 파일 다운로드를 수행한다.
// AUTO: 가상 파일을 모두 다운로드한다.
// SELECTED: 선택된 대상 중에 가상 파일을 모두 다운로드한다.
// CHECKED: 체크된 대상 중에 가상 파일을 모두 다운로드한다.
dx.download("SELECTED", true);

단일 파일 다운로드와 달리 다중 파일 다운로드는 브라우저 성능 문제로 인하여 다운로드하는 파일의 크기에 제한을 두도록 했다.

기본값은 100MB이며, 파일 크기를 그 이상 허용하려면 setLimitMultiDownloadSize 함수를 사용하여 제한된 크기를 변경하면 된다.

그러나 이 함수는 다운로드가 허용되는 대상을 크기를 변경하는 것이지, 브라우저의 성능에 상관없이 다운로드가 가능하도록 기능을 제공하는 것이 아닙니다. HTML5의 기능을 사용하여 파일을 연속적으로 다운로드하려면, 일시적으로 다운로드 대상을 메모리에 로드하기 때문에, 동영상 파일과 같이 용량이 큰 파일들은 적절한 다중 파일 다운로드 대상이 아닙니다. 그러므로 대용량 다운로드, 이어 받기와 같은 기능이 필요하다면, HD 응용프로그램 사용을 권장한다.

// 다운로드 제한 크기를 300MB로 설정한다. 
dx.setLimitMultiDownloadSize(1024 * 1024 * 300);

예제

단일 파일 다운로드

다중 파일 다운로드

(브라우저가 최종적으로 파일을 저장하는 단계(제품이 관여할 수 없는)가 존재하기 때문에, 다운로드가 완료되었다 하더라도 브라우저에서 자체적으로 질의하는 메시지들이 늦게 보여지거나, 추가 질의가 있을 수 있다.)