TABS Upload 5

> 탭스 업로드

주요 기능 I

고성능 파일 업로드

탭스랩만의 One-pass 파싱 기술과 서버 버퍼 최적화 기술을 도입해 최고 성능의 업로드를 보장합니다.

대용량 파일 업로드 뿐만 아니라 여러 클라이언트로 부터의 많은 동시 업로드 상황에서도 최소한의 메모리를 사용하며 빠른 업로드 속도를 제공합니다.

2GB 이상의 대용량 분할 업로드 처리 지원

TABS Fileup4 ActiveX & Plugin을 사용할 경우 2GB 이상의 파일을 받아서 처리할 수 있습니다. 컨트롤에 의해 분할된 HTTP 요청을 서버에서 자동으로 병합해 처리하므로 간단한 ASP 코딩만으로 대용량 파일을 받을 수 있습니다.

업로드 예제 코드

탭스 업로드 컴포넌트를 사용한 가장 간단한 형태의 업로드 프로그래밍 예를 설명합니다. 다음은 파일 업로드를 위한 form 태그 구성입니다.

<form method="post" enctype="multipart/form-data" action="upload.asp">
    <input type="text" name="userName">
    <select size="4" name="favorite" multiple>
		<option>독서</option>
		<option>스포츠</option>
		<option>자동차</option>
		<option>여행</option>
	</select>
    <input type="file" name="uploadFile">
    <input type="submit" name="submit" value="Upload">
</form>

다음 코드는 사용자가 폼에서 업로드 버튼을 클릭할 경우 실제 업로드되는 데이터를 처리하는 페이지입니다.

'업로드를 처리할 오브젝트를 생성합니다.
Set Upload = Server.CreateObject("TABSUpload4.Upload")
'업로드 파일 최대 크기를 제한합니다.
Upload.MaxBytesToAbort = 10 * 1024 * 1024
'업로드를 시작합니다.
Upload.Start "C:\TEMP"
'업로드된 파일을 디스크에 저장합니다.
Upload.Save "C:\DataFiles", False

'일반 폼 데이터를 출력합니다.
Response.Write Upload.Form("userName")
For I = 1 To Upload.Form("favorite").Count
	Response.Write "관심 분야: " & Upload.Form("favorite")(I)
Next

'업로드된 파일 정보를 출력합니다.
Set File = Upload.Form("uploadFile")
Response.Write File.FileName
Response.Write File.SaveName

다운로드 지원

일반 파일 또는 데이터베이스에 저장된 파일을 다운로드 할 수 있습니다.

다운로드시 파일의 MIME 형식을 자동으로 결정해 줍니다.

다운로드 실패시 실패한 지점부터 다시 이어 받기가 가능합니다.

2GB 보다 큰 파일에 대한 다운로드를 지원합니다.

데이터베이스 및 BLOB 지원

업로드된 데이터를 데이터베이스 필드에 저장할 수 있으며, 데이터베이스에 저장된 파일 데이터를 다운로드할 수 있습니다.

데이터베이스 또는 파일에서 BLOB 데이터를 읽어서 처리할 수 있습니다.

다운로드 예제 코드

서버에 저장되어 있는 파일의 이름을 변경해 다운로드 받는 예제입니다. 파일 다운로드를 위해 HTTP 헤더를 직접 조작할 필요없이 매우 간단하게 전송할 수 있습니다.

'파일 이름을 변경해서 전송하는 경우
Set Download = Server.CreateObject("TABSUpload4.Download")
Download.FilePath = "C:\Documents\20121021.xls"
Download.FileName = "10월 월간 보고서.xls"
'웹 브라우저 내에 엑셀이 실행되지 않고 파일로 저장하게끔 지정
Download.TransferFile True, True

네트워크 공유 파일 시스템 지원

네트워크 공유 디렉터리를 액세스하기 위해 IIS 익명 인증 계정을 높은 보안 권한을 갖는 일반 계정으로 권한 상승시킬 필요가 없습니다. 권한 상승에 따른 보안 취약점을 사전에 차단할 수 있습니다.

IIS 프로세스 계정을 변경시키지 않고 네트워크 공유 리소스에 접근이 필요한 경우 일시적으로 가장(impersonation)을 통해 보안 권한을 변경하고 사용이 끝났으면 원 보안 권한으로 돌아가는 방식을 제공합니다.

업로드/다운로드 파일 액세스 뿐만 아니라 FileSystemObject를 사용해 디렉터리/파일 생성과 삭제 등의 작업에도 동일하게 적용할 수 있습니다.

자격 증명 예제 코드

네트워크 공유 폴더를 액세스할 수 있는 윈도우 계정과 암호를 사용해 자격증명 문자열을 생성합니다.

Set Credential = CreateObject("TABSUpload4.Credential")
WScript.StdOut.WriteLine Credential.CreateEncrypted("your_account", "your_password")

자격증명 문자열을 사용해 공유 서버로 인증을 시도하고 인증에 성공하면 폴더 생성 및 업로드 파일 저장 등의 작업을 진행할 수 있습니다.

Set Upload = Server.CreateObject("TABSUpload4.Upload")
Upload.Start "C:\TEMP"

encCredential = "fGv+5UAaG28uGQPd8NM6utV01A/WslF38UoqVUO4Farv0IRDeduB/4LB0tV27NfTgfJWTuwj6yo="
Set Credential = Server.CreateObject("TABSUpload4.Credential")
'네트워크 공유 서버로 인증을 위해 가장
If Credential.Impersonate(encCredential) Then
    'FileSystemObject로 네트워크 공유 파일/디렉터리 액세스
    Set fso = Server.CreateObject("Scripting.FileSystemObject")
    Set f = fso.CreateFolder("\\192.168.1.186\Upload\File1")   
    '네트워크 공유 폴더에 업로드 파일 저장
    Upload.Form("uploadFile").Save "\\192.168.1.186\Upload\File1", False
    '가장 해제
    Credential.Revert
End If

웹 이미지 포맷 지원

이미지 포맷 중 JPEG, PNG, TIFF, GIF, BMP 파일을 읽어서 처리할 수 있습니다.

처리한 이미지는 웹에서 사용되는 JPEG, PNG 파일 포맷으로 저장할 수 있습니다.

다양한 이미지 프로세싱 지원

이미지 크기를 자유롭게 변경할 수 있으며 변경시 손실을 최소화하도록 Bicubic, Bilinear 알고리즘을 지원해 고품질 썸네일을 생성해서 저장할 수 있습니다.

업로드된 이미지에 로고를 기록할 수 있도록 이미지 합성 기능을 제공합니다. 투명(알파) 성분이 포함되어 있는 PNG 이미지를 합성할 수 있으며 합성시 투명도를 설정할 수 있습니다.

RGB 기반의 색상 조정, 명도/대비/채도 조정, Auto Level 등의 색상 조정 기능을 제공합니다. Blur, sharpen 과 같은 기본적인 필터와 Sketch, Whitening, Oil Painting과 같은 고급 이미지 필터를 제공합니다.

시스템에 설치되어 있는 폰트를 사용해 이미지 위에 텍스트를 출력할 수 있습니다. 다양한 폰트 속성, 정렬을 사용할 수 있으며 출력시 투명도를 조절할 수 있습니다.

EXIF 정보 참조

디지털 카메라로 찍은 이미지의 경우 이미지 파일 내에 EXIF 정보가 존재합니다. 이미지 컴포넌트는 이를 읽어 출력할 수 있습니다.

이미지 처리 예제 코드

서버로 업로드한 이미지에 지정되 로고 이미지를 합성한 후 썸네일 이미지를 생성하는 예제입니다.

'업로드를 처리할 오브젝트를 생성합니다.
Set Upload = Server.CreateObject("TABSUpload4.Upload")
'업로드를 시작합니다.
Upload.Start "C:\TEMP"
'업로드된 파일을 디스크에 저장합니다.(Overwrite)
Upload.Save "C:\TEMP", True

Set File = Upload.Form("uploadFile")

'이미지를 처리할 오브젝트를 생성합니다.
Set Image = Server.CreateObject("TABSUpload4.Image")
'이미지를 로딩합니다.
Status = Image.Load(File.SaveName)
If Status = Ok Then
    Response.Write "이미지 크기: " & Image.Width & " x " & Image.Height

    'logo.png를 읽어 투명 모드로 합성한다.
    Set LogoImage = Server.CreateObject("TABSUpload4.Image")
    Status = LogoImage.Load(Server.MapPath("logo.png"))
    If Status = Ok Then
        Image.DrawImage LogoImage, 70, 130, 128
        LogoImage.Close
    End If

    '썸네일 이미지를 생성합니다.
    Image.SaveThumbnail "C:\TEMP\thumb300.jpg", 300, 0, 90 
    Image.SaveThumbnail "C:\TEMP\thumb200.jpg", 200, 0, 90
    Image.Close
Else
    Response.Write "이미지 파일을 열 수 없습니다. 오류 코드: " & Status
End If

바이너리 데이터 업로드

표준 업로드 방식은 multipart/form-data 방식과 다르게 파일 데이터를 직접 서버로 전송하는 업로드를 처리할 수 있습니다.

HTML5의 FileAPI와 AJAX을 사용해 바이너리 데이터 업로드를 구현하며 ASP에서는 탭스 업로드를 사용해 파일을 저장할 수 있습니다.

조각화(chunked) 업로드

파일 데이터를 작은 조각으로 나누어 각각의 HTTP 요청으로 서버로 전송하며 ASP에서는 탭스 업로드를 사용해 조각화된 데이터를 합쳐 완성된 파일을 저장합니다.

조각화 업로드는 대용량 파일 업로드시 웹 브라우저의 메모리 사용을 최소화하고 웹 서버의 HTTP 요청 크기 제한에 영향을 받지 않으면서 2GB 이상의 대용량 파일을 전송할 수 있습니다.

아래는 조각화된 HTTP 업로드 요청을 서버에서 처리하는 코드입니다.

UploadPath = "C:\Temp\Upload"

Set upload = Server.CreateObject("TABSUpload4.UploadSingle")
'하나의 파일에 대한 청크 바이너리 업로드 데이터를 처리한다.
upload.StartChunked "C:\Temp"

'마지막 청크가 도착해 업로드가 완료되었는지 검사한다.
If upload.ChunkedUploadCompleted Then
    ' 업로드가 완료되면 실제 파일로 저장한다.
    upload.Save UploadPath, False
    Response.Write upload.ShortSaveName & upload.FileSize
End If

JSON 오브젝트를 ASP 페이지로 전달

JSON(제이슨, JavaScript Object Notation)은 속성-값 쌍으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷입니다.

자바스크립트에서 사용한 JSON 오브젝트를 JSON 텍스트로 변환해 서버로 전송한 경우 아래 코드와 같이 JSON 텍스트 해석해 사용할 수 있습니다.

Dim json, person
Set json = Server.CreateObject("TABS.JSON")
Set person = json.FromString(Request("jsonText"))

Response.Write person("name")
Response.Write person("age")
Response.Write person("family")("father")

ASP 페이지에서 JSON 오브젝트 반환

위 와는 반대로 서버 페이지에서 JSON 오브젝트를 생성해 JSON 텍스트로 바꾼 후 자바스크립트로 전달해 사용할 수 있습니다.

Dim json
Set json = Server.CreateObject("TABS.JSON")

'오브젝트에 프로퍼티 값 추가
json("name") = "홍길동"
json("age") = 20
json("male") = True
json("address") = Null

'오브젝트의 프로퍼티에 또 다른 오브젝트 추가
Set family = Server.CreateObject("TABS.JSON")
family("count") = 2
family("father") = "홍판서"
family("mother") = "춘섬"
json("family") = family

'오브젝트의 프로퍼티에 배열 추가
Dim vector(2)
vector(0) = 100
vector(1) = 200
vector(2) = 300
json("vector") = vector

Response.Write json.ToString(0)

다음과 같은 JSON 텍스트가 반환됩니다.

{"address":null,"age":20,"family":{"count":2,"father":"홍판서","mother":"춘섬"},"male":true,"name":"홍길동","vector":[100,200,300]}

시간 기준 캐시

가장 일반적으로 사용되는 캐시 방법으로 매 일정 시간 마다 만료되는 캐시 데이터를 정의할 수 있습니다.

아래 예제는 매 5분 마다 캐시 데이터가 만료되어 새롭게 갱신됩니다.

Dim cache, value
Set cache = Server.CreateObject("TABS.DataCache")
value = cache("cache-key")
If IsNull(value) Then
    value = "new cached value"

    cache.Insert "cache-key", value, Null, 0, 300
End If

시간 만료 외에 또 다른 캐시 데이터, 파일, DB 테이블 필드 값의 변화에 따라 함께 만료될 수 있는 캐시 데이터를 정의할 수 있습니다.

파일 변화 시 만료되는 캐시

임의의 파일에 캐시 데이터가 의존적 이도록 지정할 수 있습니다. 지정된 파일이 생성되거나 지정된 파일이 변할 경우 캐시 데이터가 자동으로 만료되게 됩니다.

아래 코드는 sample.txt 파일에 의존하는 캐시 데이터를 정의하고 있습니다. sample.txt 파일의 내용을 캐시 데이터로 사용하고 있으며 파일이 변경되는 경우에 한해서 sample.txt 파일의 내용을 다시 읽어 캐시 데이터를 구성하고 있습니다.

Dim cache, value, fso, f, dependency, filePath
Set cache = Server.CreateObject("TABS.DataCache")
value = cache("fcache-key")
If IsNull(value) Then
    filePath = Server.MapPath("sample.txt")
    Set fso = Server.CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(filePath, 1)
    value = f.ReadAll

    Set dependency  = Server.CreateObject("TABS.CacheDependency")
    dependency.AddFile filePath
    cache.Insert "fcache-key", value, dependency, 0, 0
End If