상세 컨텐츠

본문 제목

DEXTUpload Code Samples

프로그래밍/JAVA

by 라제폰 2009. 1. 23. 17:01

본문

파일 업로드 기본


간단한 파일업로드

전송할 Form이 있는 페이지(SimpleUpload.asp)는 다음과 같은 형태로 작성된다.

[SimpleUpload.asp]
<HTML>
<BODY>
<FORM NAME="writeform" METHOD="post" ACTION="SU_Process.asp" ENCTYPE="multipart/form-data">
<INPUT TYPE="file" NAME="file1"><BR>
<INPUT TYPE="submit" VALUE="upload">
</FORM>
</BODY>
</HTML>


Form tag에 지정된 ENCTYPE="multipart/form-data" 는 파일데이터<input type= "file">를 포함하고 있는 폼을 전송하기 위해서 반드시 필요한 속성으로서 생략될 수 없다.
다음은 실제로 파일 업로드 등의 작업을 수행하는 페이지(SU_Process.asp)이다.

[SU_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"
uploadform.Save ' uploadform("file1").Save 라고 해도 됨.
Set uploadform = Nothing
%>
</BODY>
</HTML> 


위 코드에 따라 업로드된 파일은 디폴트 경로인 "c:\"에 저장된다. 디폴트 경로를 바꾸고 싶으면 개체 생성코드 다음 위치에 uploadform.DefaultPath = "c:\temp" 와 같은 코드를 넣어주면 된다. uploadform.Save는 업로드된 파일을 서버에 디스크파일 형태로 저장하는 것으로 uploadform("file1")
.Save와 같다. 여기서 "file1"은 <INPUT TYPE="file" NAME="file1">에서의 NAME속성에 해당되는 이름과 같아야 한다. Save함수들에 대한 자세한 설명은 아래에 있는 "다양한 Save Method들" 장에 기술되어 있다.

※ 아래 "Multiple Upload" 예제에서 처럼 <INPUT TYPE= "file"...>항목이 여러 개일 경우, uloadform.Save, uploadform.SaveAs, uploadform.SaveVirtual, uploadform.SaveAsVirtual, uploadform.SaveAsBlob, uploadform.FileLen, uploadform.FileName, uploadform.FilePath, uploadform.MimeType 과 같은 표현은 모두 uploadform("file1").xxx 와 동일한 표현이며, 여러 개의 <<INPUT TYPE="file"...>항목 중 첫 번째 파일항목을 가리킨다.



다중파일 업로드   ( Improved in v1.5 )

다음 예제는 여러 개의 파일을 동시에 업로드하는 방법을 보여주고 있다.

[MultipleUpload.asp]
<HTML>
<BODY>
<FORM NAME="writeform" METHOD="post" ACTION="MU_Process.asp" ENCTYPE="multipart/form-data">
<INPUT TYPE="file" NAME="file1"><BR>
<INPUT TYPE="file" NAME="file2"><BR>
<INPUT TYPE="file" NAME="file3"><BR>
<INPUT TYPE="submit" VALUE="upload">
</FORM>
</BODY>
</HTML>

[MU_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"
uploadform("file1").Save ' uploadform.Save라고 해도 됨
uploadform("file2").Save
uploadform("file3").Save
Set uploadform = Nothing
%>
</BODY>
</HTML>


업로드된 파일들에 대한 참조는 "file1", "file2", "file3"와 같은 NAME 속성값들을 통해서 이루어진다.
또 다른 방법으로, 여러 INPUT항목들의 NAME 속성을 동일한 값으로 지정한 다음 반복문을 이용해서 한꺼번에 저장할 수도 있다. 다음은 이를 보여주는 예제이다.

[MultipleUpload2.asp]
<HTML>
<BODY>
<FORM NAME="writeform" METHOD="post" ACTION="MU_Process.asp" ENCTYPE="multipart/form-data">
<INPUT TYPE="file" NAME="files"><BR>
<INPUT TYPE="file" NAME="files"><BR>
<INPUT TYPE="file" NAME="files"><BR>
<INPUT TYPE="submit" VALUE="upload">
</FORM>
</BODY>
</HTML>

[MU_Process2.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"
For i = 1 To uploadform("files").Count
  uploadform("files")(i).Save
Next
Set uploadform = Nothing
%>
</BODY>
</HTML>

</HTML>


위 예제에서 For문을 다음과 같이 작성해도 동일한 결과를 얻을 수 있다.

For Each item In uploadform("files")
  item.Save
Next




다른 폼요소와 함께 업로드

Form의 다른 요소들도 파일요소와 마찬가지로 NAME 속성값을 통해서 참조할 수 있다.

[UploadElements.asp]
<HTML>
<BODY>
<FORM NAME="writeform" METHOD="post" ACTION="UE_Process.asp" ENCTYPE="multipart/form-data">
<INPUT TYPE="text" NAME="title"><BR>
<TEXTAREA NAME="content" ROWS="10" COLS="50"></TEXTAREA><BR>
<INPUT TYPE="file" NAME="file1"><BR>
<INPUT TYPE="submit" VALUE="upload">
</FORM>
</BODY>
</HTML>

[UE_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"
title = uploadform("title")
content = uploadform("content")
uploadform("file1").Save
Set uploadform = Nothing
%>
</BODY>
</HTML>



Multi-select 폼요소를 포함한 업로드  ( Improved in v1.5 )

DEXTUpload는 ListBox, Radio button 등과 같이 하나의 Name 속성에 대해 여러 Value값들을 가질 수 있는 Multi-select 폼 요소들을 처리할 때, Request.Form을 쓰는 것처럼 편리하게 이를 처리할 수 있다.

[UploadMultiElements.asp]
<HTML>
<BODY>
<FORM NAME="writeform" METHOD="post" ACTION="UE_Process.asp" ENCTYPE="multipart/form-data">
<H2>Select your favorite sports</H2>
<SELECT NAME="Sports" MULTIPLE>
<OPTION VALUE="Soccer">Soccer</OPTION>
<OPTION VALUE="Baseball">Baseball</OPTION>
<OPTION VALUE="basketball">Basketball</OPTION>
</SELECT><BR>
<INPUT TYPE="file" NAME="DescFile"><BR>
<INPUT TYPE="submit" VALUE="upload">
</FORM>
</BODY>
</HTML>


[UME_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"
Response.Write "Your favorite sports :<br>"

For i = 1 To uploadform("Sports").Count
  Response.Write "-" & uploadform("Sports")(i) & "<br>"

Next

uploadform("DescFile").Save
Set uploadform = Nothing
%>
</BODY>
</HTML>



위 예제에서 For문을 다음과 같이 작성해도 동일한 결과를 얻을 수 있다.

For Each item In uploadform("Sports")
  Response.Write "-" & item & "<br>"
Next



업로드된 파일로 부터 정보 얻기  ( Improved in v1.5 )

업로드된 파일에 대한 정보를 얻을 수 있도록 다음과 같은 Property들이 제공된다.
.FileLen : 업로드된 파일의 길이
.FileName : 업로드된 파일의 이름(경로제외)
.FilePath : 업로드된 파일의 전체경로
.MimeType : 업로드된 파일의 Mime Type
.LastSavedFileName : 업로드되어 실제로 서버에 저장된 파일의 이름(경로제외)
.LastSavedFilePath : 업로드되어 실제로 서버에 저장된 파일의 전체경로

※ .FileName과 .FilePath는 사용자가 업로드한 오리지널 파일에 대한 이름과 전체경로값을 가진다. 업로드되어 서버에 저장된 파일의 전체경로값은 .Save, .SaveAs Method 등의 리턴값으로부터 얻을 수 있다.

[Form_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "d:\upload"
Response.Write "[Uploaded File Information] <BR>"
Response.Write "FileName : " & uploadform("file1").FileName & "<BR>"
Response.Write "FullPath : " & uploadform("file1").FilePath & "<BR>"
Response.Write "FileLength : " & uploadform("file1").FileLen & " Byte(s)<BR>"
Response.Write "MimeType : " & uploadform("file1").MimeType & "<BR>"

uploadedpath = uploadform("file1").Save
Response.Write "UploadedPath : " & uploadedpath & "<BR>"
Response.Write "LastSavedFilePath : " & uploadform("file1").LastSavedFilePath & "<BR>"
Response.Write "LastSavedFileName : " &
uploadform("file1").LastSavedFileName
Set uploadform = Nothing
%>
</BODY>
</HTML> 


위 페이지가 실행된 결과는 다음과 같은 형태로 나타날 것이다.

[Uploaded File Information]
FileName : sample.jpg
FullPath : c:\data\sample.jpg
FileLength : 176816 Byte(s)
MimeType : image/pjpeg
UploadedPath : d:\upload\sample.jpg
LastSavedFilePath : d:\upload\sample.jpg
LastSavedFileName : sample.jpg



이미지 파일(GIF/JPG/BMP)의 폭과 높이 정보 얻기   ( New in v1.5 )

업로드된 파일이 이미지 파일(GIF/JPG/BMP)인 경우 다음과 같이 이미지의 폭과 높이 정보 등을 얻을 수 있는 추가적인 Property들이 제공된다.

.ImageFormat : 업로드된 이미지 파일의 포멧
.ImageWidth  : 업로드된 이미지 파일의 폭
.ImageHeight : 업로드된 이미지 파일의 높이

[Form_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"
Response.Write "[Uploaded File Information] <BR>"
Response.Write "FileName : " & uploadform("file1").FileName & "<BR>"
Response.Write "FullPath : " & uploadform("file1").FilePath & "<BR>"
Response.Write "FileLength : " & uploadform("file1").FileLen & " Byte(s)<BR>"
Response.Write "MimeType : " & uploadform("file1").MimeType & "<BR>"
Response.Write "ImageFormat : " & uploadform("file1").ImageFormat & "<BR>"
Response.Write "ImageWidth : " & uploadform("file1").ImageWidth & "<BR>"
Response.Write "ImageHeight : " & uploadform("file1").ImageHeight & "<BR>"


uploadedpath = uploadform("file1").Save
Response.Write "UploadedPath : " & uploadedpath
Set uploadform = Nothing
%>
</BODY>
</HTML> 


위 페이지가 실행된 결과는 다음과 같은 형태로 나타날 것이다.

[Uploaded File Information]
FileName : sample.jpg
FullPath : c:\data\sample.jpg
FileLength : 176816 Byte(s)
MimeType : image/pjpeg
ImageFormat : JPG
ImageWidth : 1024
ImageHeight : 768

UploadedPath : c:\temp\sample.jpg




Database BLOB필드로 업로드

다음과 같이 SaveAsBlob Method를 이용하면 파일을 업로드하여 Database BLOB필드로 저장할 수 있다.

[Form_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath= "c:\temp"
Setrs=Server.CreateObject("ADODB.Recordset")rs.Open"SampleTable","DSN=SampleDSN;UID=sa;PWD=xxx;", 3, 3
rs.AddNew
rs("filename") = uploadform("file1").FileName
rs("mimetype") = uploadform("file1").MimeType
uploadform("file1").SaveAsBlob rs("filedata")
rs.Update

rs.Close
Set rs = Nothing
Set uploadform = Nothing
%>
</BODY>
</HTML>


※ DEXTUpload 컴포넌트가 제공하는 Database BLOB관련 Method로는 다음과 같은 것들이 있다.
FileUpload 개체의 SaveAsBlob : 파일을 업로드하여 Database BLOB 필드에 저장한다.
FileDownload 개체의 DownloadBlob : Database BLOB을 사용자의 디스크로 다운받아 파일로 저장한다.
BLOBManager 개체의 SaveFileAsBlob : 서버에 존재하는 파일을 Database BLOB필드에 저장한다.
BLOBManager 개체의 SaveBlobAsFile : Database BLOB을 서버의 디스크 파일로 저장한다.




다양한 Save Method들

DEXTUpload 컴포넌트는 업로드된 파일을 서버 파일시스템 또는 Database에 저장할 수 있는 다양한 방법을 제공한다.
* 업로드된 파일과 동일한 이름의 파일로 서버에 저장하는 Method
- Save : DefaultPath property값으로 지정된 경로에 저장
- Save [Path지정] : 지정된 경로에 저장
- SaveVirtual [Virtual Path지정] : 지정된 가상경로에 저장

* 업로드된 파일과 다른 이름의 파일로 서버에 저장하는 Method
- SaveAs [Full Path지정] : 지정된 경로와 파일명으로 저장
- SaveAsVirtual [Full Virtual Path지정] : 지정된 가상경로와 파일명으로 저장

* 업로드된 파일을 Database BLOB필드에 저장하는 함수
- SaveAsBlob [ADO Field개체지정] : 지정된 Database BLOB필드에 저장

※ SaveAsBlob을 제외한 나머지 모든 Save Method들은 bOverwrite 라는 인자와 실제로 서버에 저장되는 파일에 대한 전체경로를 리턴값으로 가진다. bOverwrite 인자를 생략할 경우 기본값은 True이며 해당 경로에 같은 이름의 파일이 있을 경우 겹쳐쓰게 된다. bOverwrite 인자값을 명시적으로 False로 지정할 경우는 유일한 파일 명( filename(2).ext, filename(3).ext ... )을 구해서 저장하게 된다.




파일의 존재여부 체크 및 업로드된 파일의 삭제  ( New in v1.5 )

DEXTUpload는 파일의 존재여부를 체크할 수 있는 FileExists 메쏘드와 업로드된 파일을 삭제할 수 있는 DeleteFile 메쏘드를 제공한다. 다음은 FileExists와 SaveAs 메쏘드를 이용하여 업로드한 파일을 서버에 고유한 파일명으로 저장하는 예제이다. 

[Form_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"

filename = uploadform("file1").FileName
filepath = uploadform.DefaultPath & "\" & filename

If uploadform.FileExists(filepath) Then

    ' Get FileName and FileExt
   
If InStrRev(filename, ".") <> 0 Then 
      filenameonly = Left(filename, InStrRev(filename, ".") - 1) 
      fileext = Mid(filename, InStrRev(filename, ".")) 
   Else 
      filenameonly = filename 
      fileext = "" 
   End If

   ' Get Unique FileName
   
i = 2
   Do While (1)
      filepath =  uploadform.DefaultPath & "\" & filenameonly & "[" & i & "]" & fileext
      If Not uploadform.FileExists(filepath) Then Exit Do 
      i = i + 1
   Loop
End If

uploadform("file1").SaveAs filepath

' If you want to delete this file
' uploadform.DeleteFile filepath

Set uploadform = Nothing

%>
</BODY>
</HTML>


※ DEXTUpload는 파일을 고유한 이름으로 저장할 수 있는 기능을 기본적으로 제공한다. 위 예제는 단지 DEXTUpload가 제공하는 방식이 아니라 사용자 나름대로의 방식대로 고유한 파일명을 결정하고자 할 경우의 예를 보여준 것이다.





파일 업로드 활용


고유한 이름으로 파일 저장

Save, SaveVirtual, SaveAs, SaveAsVirtual Method 는 기본적으로 업로드된 파일을 서버에 저장할 때 해당 경로에 동일한 이름의 파일이 존재할 경우 겹쳐쓰게 된다. 겹쳐쓰지 않고 유일한 파일명을 구해서 저장하고 싶으면 두 번째 인자인 bOverwrite를 명시적으로 False로 지정하면 된다. ("다양한 Save Method들"   Chapter 참조)

[Form_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"
uploadedfile = uploadform.SaveAs("c:\data\sample.zip", False)
Response.Write "uploaded file : " & uploadedfile
Set uploadform = Nothing
%>
</BODY>
</HTML>

위 예제에서 c:\data 폴더에 sample.zip이라는 파일이 이미 존재할 경우 업로드된 파일은 "c:\data\sample(2).zip"이라는 이름으로 저장되어 다음과 같은 결과 페이지를 보여주게 된다.

[ 실행결과 ]
uploaded file : c:\data\sample(2).zip



업로드 파일 용량 제한

MaxFileLen property를 이용하면 업로드 가능한 최대 파일 크기를 제한할 수 있다. 만일 지정된 크기보다 큰 파일을 업로드할 경우에는 다음과 같은 오류가 발생하게 된다.

DEXTUpload error '80040200'
Warning: File size must be less than 5242880 Bytes.
/form_process.asp, line 27

다음 예제와 같이 FileLen property를 이용해서 최대 파일 크기를 초과하지 않는 경우에만 Save Method를 호출하게 하는 방법으로 오류발생 없이 업로드 파일크기 제한에 대한 처리를 커스터마이징 할 수도 있다.

[Form_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"
uploadform.MaxFileLen = 5242880

If uploadform("file1").FileLen > uploadform.MaxFileLen Then 
    Response.Write "File size must be less than 5MBytes.<br>" 
    Response.Write "Press the back button on your browser...<br>"
Else 
   uploadform("file1").Save
End If
Set uploadform = Nothing
%>
</BODY>
</HTML>



업로드 타임아웃 설정

일반적으로 파일 업로드 또는 Save 등과 같은 작업은 대용량 파일 업로드시 긴 시간을 요하므로
Server.ScriptTimeout(Default: 90sec)과 Session.Timeout(Default: 20min) 값을 바꾸어 주지 않을 경우 Timeout 에러로 인해 업로드 작업을 정상적으로 수행할 수 없게 된다.

DEXTUpload는 UploadTimeout property를 제공함으로써, 파일 업로드시 별도의 Server.ScriptTimeout,
Session.Timeout 설정을 하지 않고도 Timeout에러 없이 대용량 파일 업로드 작업을 정상적으로 수행할
수 있다. 기본 값은 3600sec(60min)이고 필요에 따라 변경해서 사용하면 된다.

[Form_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"
uploadform.UploadTimeout = 1800

uploadform.Save
Set uploadform = Nothing
%>
</BODY>
</HTML> 


위 예제에서는 UploadTimeout값을 1800sec(30min)로 설정했으므로, Save작업이 1800sec를 초과하지
않는 한 Timeout에러가 발생하지 않는다.



업로드 파일 종류 제한

DEXTUpload가 제공하는 MimeType property를 이용하면 업로드 가능한 파일의 종류를 제한할 수 있다.
다음은 GIF와 JPG 파일만 업로드할 수 있도록 하는 예제이다.

[Form_Process.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"

mimetype = uploadform("file1").MimeType
If mimetype="image/gif" or mimetype="image/pjpeg" Then
   uploadform("file1").Save
Else
   Response.Write "Your file must be GIF or JPG...<br>"
End If

Set uploadform = Nothing
%>
</BODY>
</HTML>



외국어 및 유니코드 문자셋으로된 웹페이지에서의 사용방법

DEXTUpload가 제공하는 CodePage property를 이용하면 외국어 및 유니코드로된 폼요소값 및 파일명의 처리가 가능하다. 다음은 유니코드 문자셋을 사용하는 웹페이지에서 DEXTUpload를 사용하는 예제이다.

[Form.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<%
old_codepage = Session.CodePage
Session.CodePage = "65001"

%>

<HTML>
<HEAD>
<
META http-equiv="Content-Type" content="text/html; charset=utf-8">
</HEAD>
<BODY>
 
<
FORM name="upform" method="post" action="form_proc.asp" enctype="multipart/form-data">
<INPUT type="text" name="title"><br>
<INPUT type="file" name="upfile"><br>
<INPUT type="submit" name="submit" value="send">
</FORM>

</BODY>
</HTML>
<%
Session.CodePage = old_codepage
%>



[Form_Proc.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<%
old_codepage = Session.CodePage
Session.CodePage = "65001"

%>

<META http-equiv="Content-Type" content="text/html; charset=utf-8" >

<%

Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "D:\Temp"
uploadform.CodePage = 65001

Response.Write "title: " & uploadform("title") & "<BR>"
Response.Write "filename: " & uploadform("upfile").FileName
uploadform.Save

Set uploadform = Nothing
Session.CodePage = old_codepage
%>



파일저장 없이도 업로드작업을 취소하는 방법

DEXTUpload가 제공하는 Flush method를 이용하면 실제로 파일을 서버에 저장하지 않고도
필요에 따라 업로드 작업을 완전히 취소하고 나머지 코드를 계속 실행하도록 할 수 있다.
다음은 파일 업로드시 제한된 업로드 용량을 초과할 경우 업로드를 취소하고 에러메시지를 보여주는 예제이다.

[Form_Proc.asp]
<%@ LANGUAGE="VBSCRIPT"%>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "D:\Temp"

If Request.TotalBytes > 1048576 Then 
      uploadform.Flush
      Response.Write "Warning: File size must be less than 1 MBytes."
Else
      uploadform.Save
      Response.Write "File-upload completed."
End If

Set uploadform = Nothing
%>



서버측 업로드 진행율 표시기 사용  ( Improved in v1.5 )

Server-side Graphical Progress Indicator를 이용하면 ActiveX Control이나 Java Applet과 같은 별도의 Client-side 소프트웨어를 다운로드 받지 않고도 단지 서버측 컴포넌트만으로 파일 업로드 진행상태를 시각적으로 보여주고, 업로드 속도, 전체 컨텐츠의 크기 및 현재 업로드된 컨텐츠의 크기, 남은 시간, 현재 진행되고 있는 작업 등의 정보를 실시간으로 모니터링할 수 있다.

이 기능은 FileUploadMonitor개체를 통해서 구현되며 다음과 같은 두 개의 Method가 제공된다.
UseMonitor : Form을 작성하는 페이지에서 호출되며, Progress Indicator의 모니터링 기능을 켠다.
ShowMonitor : Progress Indicator를 보여주는 페이지(창)에서 호출되며, 업로드 진행상태를 시각적으로 보여준다.

[ Form 작성 페이지 (GPIUpload.asp) ]

<%@ LANGUAGE="VBSCRIPT"%>
<%
Set objMon = Server.CreateObject("DEXT.FileUploadMonitor")
objMon.UseMonitor(True)
Set objMon = Nothing
%>

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!--
function ShowProgress()
{
   strAppVersion = navigator.appVersion;
   if (document.writeform.file1.value != "") {

      if (strAppVersion.indexOf('MSIE')!=-1 && 
          strAppVersion.substr(strAppVersion.indexOf('MSIE')+5,1) > 4) {

          winstyle = "dialogWidth=385px; dialogHeight:150px; center:yes"; 
          window.showModelessDialog("show_progress.asp?nav=ie", null, winstyle);
      }
      else 
          winpos = "left=" + ((window.screen.width-380)/2)+",top=" +
               ((window.screen.height-110)/2);
< BR >          winstyle="width=380,height=110,status=no,toolbar=no,menubar=no," + 
               "location=no,
resizable=no,scrollbars=no,copyhistory=no," + winpos;
          window.open("show_progress.asp",null,winstyle);
      } 
   }

   return true;
}

//-->
</SCRIPT>
</HEAD>

<BODY>
<FORM NAME="writeform" METHOD="post" ACTION= "form_process.asp"< BR>      ENCTYPE="multipart/form-data" onSubmit="return ShowProgress();">

<INPUT TYPE="file" NAME="file1"><BR>
<INPUT TYPE="submit" VALUE="upload">
</FORM>
</BODY>
</HTML>



Progress Indicator를 사용하기 위해서는 위 예제와 같이 Form 작성 페이지 상단에서 FileUploadMonitor개체의 UseMonitor Method를 True를 인자로 해서 호출해야한다. 만일 UserMonitor Method를 호출하지 않거나 False를 인자로 해서 호출하게 되면 Progress Indicator 기능을 사용하지 않는 것으로 간주된다. 위 예제를 보면 Form을 Submit하기 직전에 ShowProgress()라는 함수를 호출하여 Progress Indicator를 시각적으 로 보여주기 위해 새 창(또는 대화상자)을 띄워 주는 것을 볼 수 있다.
이 때, 새 창에서 보여지는 페이지는 다음과 같다.

[ Progress Indicator를 보여주는 페이지 (show_progress.asp) ]

<%@ EnableSessionState=False%>

<%
'Case of Netscape Navigator
If Request("nav") = "ns" Then

%>
    <frameset rows="80,1*" border="0" framespacing="0" frameborder="no">
   <frame src="show_prog_body.asp" noresize scrolling="NO" frameborder="NO" 
      name="sp_body">
   <frame src="show_prog_bottom.asp" noresize scrolling="NO" frameborder="NO"
      name="sp_bottom">

<%
'Case of Internet Explorer
Else
%>
   <HTML>
   <HEAD>
   <TITLE>Uploading Files...</TITLE>
   <STYLE type="text/css">
       td {font-size: 9pt}
   </STYLE>
   </HEAD>

   <BODY bgcolor="#d4d0c8" leftmargin="8" topmargin="0" scroll="no">
   <IFRAME src="show_prog_body.asp" title="Progress Step1" frameborder=0
       marginheight=0 marginwidth=0 noresize scrolling=no width=365 height=65>
   </IFRAME>
<BR><BR>

   <TABLE border="0" width="365" cellpadding="2" cellspacing="0" bgcolor="#d4d0c8">
   <TR><TD>Click the <B>STOP</B> button on your browser to abort uploading.</TD></TR>
   </TABLE>

   </BODY>
   </HTML>
<%
End If
%>
 

Progress Indicator를 보여주기 위해서는 위에 있는 show_progress.asp와 함께 다음에 있는 show_prog_body.asp와 show_prog_bottom.asp가 필요하다.
1) show_progress.asp: Progress Indicator를 보여주기 위해 웹페이지를 프레임으로 나눈다.
2) show_prog_body.asp: 실제로 Progress Indicator를 보여준다.
3) show_prog_bottom.asp: (Netscape Navigator와 같이 Inline Frame을 지원하지 않는 브라우저의 경우
    만 필요) 

[ Progress Indicator를 보여주는 페이지 (show_prog_body.asp) ]

<%@ EnableSessionState=False%>
<%
Set m_objMon = Server.CreateObject("DEXT.FileUploadMonitor")
m_objMon.ShowMonitor
Set m_objMon = Nothing
%>


[ Progress Indicator를 보여주는 페이지 (show_prog_bottom.asp) ]

<%@ EnableSessionState=False%>
<HTML>
<HEAD>
<STYLE type="text/css">
   td {font-size: 9pt }
</STYLE>
</HEAD>

<BODY bgcolor="#d4d0c8" leftmargin="8" topmargin="0" scroll="no">
<TABLE border="0" width="365" cellpadding="2" cellspacing="0" bgcolor="#d4d0c8">
<TR><TD>Click the <B>STOP</B> button on your browser to abort uploading.</TD></TR>
</TABLE>
</BODY>
</HTML>


위 ASP 페이지를 보면 "EnableSessionState" 속성을 False로 지정하여 세션상태를 해제하고 있다. 만일 이 페이지의 세션상태를 해제하지 않으면 Form의 submit 작업, 즉 파일 업로드 작업이 종료되기 전까지는 페이지의 실행된 결과를 볼 수 없게 되므로 반드시 페이지의 세션상태를 해제시켜야 한다. ShowMonitor Method는 매 순간의 업로드 진행상태를 보여주고 업로드가 완료되면 자동으로 창(또는 대화상자)을 닫는다. 

[ 업로드 작업을 처리하는 페이지 (form_process.asp) ]

<%@ LANGUAGE="VBSCRIPT"%>
<HTML>
<BODY>
<%
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\temp"
uploadform("file1").Save
Set uploadform = Nothing
%>
</BODY>
</HTML>

업로드 작업을 처리하는 페이지는 Progress Indicator의 사용여부에 관계없이 동일하게 작성해 주면 된다.




파일 다운로드


파일 다운로드

FileDownload개체의 Download, DownloadVirtual Method는 서버에 있는 파일을 웹브라우저를 통해 사용자가 다운로드
받을 수 있게 한다.
Download : 서버의 지정된 경로에 있는 파일을 다운로드 한다.
DownloadVirtual : 서버의 지정된 가상경로에 있는 파일을 다운로드 한다.


[Download.asp]

<%@ Language=VBScript %>
<%
Response.Buffer = False
filepath = Request.QueryString("file")
filename = Mid(filepath, InStrRev(filepath, "\")+1)

Response.AddHeader "Content-Disposition","attachment;filename=" & filename

set objFS =Server.CreateObject("Scripting.FileSystemObject")
set objF = objFS.GetFile(filepath)
Response.AddHeader "Content-Length", objF.Size
set objF = nothing
set objFS = nothing

Response.ContentType = "application/unknown"
Response.CacheControl = "public"

Set objDownload = Server.CreateObject("DEXT.FileDownload")
objDownload.Download filepath
Set uploadform = Nothing
%>

다운로드할 파일의 전체경로와 함께 상기 ASP페이지를 실행하면 해당 파일을 다운로드 받을 수 있게 된다. 페이지 상단을 보면 Response.Buffer = False 로 지정하여 버퍼링 없이 즉시 파일을 다운로드 받을 수 있게 했고, Content- Disposition, Content-Length, ContentType 등의 헤드정보를 지정한 후 Download Method를 호출하고 있다. 사용자는 웹브라우저에 나타나는 대화상자에 다운로드할 경로와 파일명을 지정하여 다운로드 받을 수 있다.



Database BLOB 데이터 다운로드

FileDownload개체의 DownloadBlob Method는 서버에 있는 Database BLOB을 웹브라우저를 통해 사용자의 디스크 파일로 다운로드 받을 수 있게 한다. Database 관련부분을 제외하고는 Download Method와 사용법이 동일하다.


[ DownloadBlob.asp ]

<%@ Language=VBScript %>
<%Response.Buffer=False
Setrs=Server.CreateObject("ADODB.Recordset")<br>strQuery="SELECT*FROMSampleTableWHEREid="&Request.QueryString("id")<br>rs.OpenstrQuery,"DSN=SampleDSN;UID=sa;PWD=xxx;", 3, 1

Response.AddHeader "Content-Disposition","attachment;filename=" & rs("filename")
Response.AddHeader "Content-Length", rs("fildata").ActualSize

Response.ContentType = "application/unknown"
Response.CacheControl = "public"

Set objDownload = Server.CreateObject("DEXT.FileDownload")
objDownload.DownloadBlob rs("filedata")
Set uploadform = Nothing

rs.Close
Set rs = Nothing
%>




서버에서의 BLOB 핸들링

DEXTUpload는 서버 내에서의 Database BLOB 처리를 위해 BlobManager라는 개체를 추가로 제공하는데, 다음과 같은 두 개의 Method를 가지고 있다.
SaveFileAsBlob : 서버에 존재하는 파일을 Database BLOB필드에 저장한다.
SaveBlobAsFile : Database BLOB을 서버에 디스크 파일형태로 저장한다.


서버에 존재하는 파일을 Database BLOB에 저장

다음은 서버의 c:\data라는 폴더에 존재하는 sample.zip이라는 파일을 Database BLOB필드에 저장하는 예이다.

[ FileToBlob.asp ]

<%@ Language=VBScript %>
<%
Ser blobman = Server.CreateObject("DEXT.BlobManager")
Setrs=Server.CreateObject("ADODB.Recordset")<br>rs.Open"SampleTable","DSN=SampleDSN;UID=sa;PWD=xxx;", 3, 3

rs.AddNew
rs("filename") = "sample.zip
blobman.SaveFileAsBlob "c:\data\sample.zip", rs("filedata")
rs.Update

rs.Close
Set rs = Nothing
Set blobman = Nothing
%>



Database BLOB 필드를 서버내 파일로 저장

다음은 Database BLOB을 서버에 디스크 파일형태로 저장하는 예이다.

[ BlobToFile.asp ]

<%@ Language=VBScript %>
<%
Ser blobman = Server.CreateObject("DEXT.BlobManager")
Setrs=Server.CreateObject("ADODB.Recordset")
strQuery= "SELECT * FROM SampleTable WHERE id=100"rs.OpenstrQuery,"DSN=SampleDSN;UID=sa;PWD=xxx;", 3, 1

filename = "c:\data\" & rs("filename")
blobman.SaveBlobAsFile rs("filedata"), filename

rs.Close
Set rs = Nothing
Set blobman = Nothing
%>



DEXTUpload 에러 처리

DEXTUpload 컴포넌트에서 발생되는 모든 오류는 Err개체를 통해서 체크할 수 있다. 오류 발생시 컴포넌트는 그때까지 사용한 모든 리소스를 반환하고, 업로드되어 서버에 저장된 모든 파일을 자동 삭제함으로써 무결성을 보장한다. 컴포넌트와 무관하게 외부 ASP코드에서 오류가 발생했을 경우에는 FileUpload개체의 DeleteAllSavedFiles Method를 호출해서 그때까지 업로드되어 서버에 저장된 모든 파일들을 수동으로 삭제할 수 있다.

<%
On Error Resume Next
Set uploadform = Server.CreateObject("DEXT.FileUpload")
uploadform.DefaultPath = "c:\data"

uploadform.Save
If Err Then
Response.Write "Error occured : <BR>"
Response.Write Err.Description
End If
...
' 외부 오류 발생으로 업로드 작업을 취소하고자 할 경우
uploadform.DeleteAllSavedFiles
...
%>


관련글 더보기