login register Sysop! about ME  
qrcode
    최초 작성일 :    2001년 07월 09일
  최종 수정일 :    2001년 07월 20일
  작성자 :    taeyo
  편집자 :    Taeyo (김 태영)
  읽음수 :    129,469

강좌 목록으로 돌아가기

필자의 잡담~

간만에 본 국산영화.. 엽기적인 그녀.. 꽤 재미있게 보았습니다. 정말 웃기더군요.. 하하.

자.. 이제부터 파일 업로드 기능을 우리의 게시판에 덧붙여 보려 합니다. 하지만, 그렇게 하기 위해서는 반드시 파일 업로드 컴포넌트를 사용해야 하는데요.. 그것은 ASP 만으로는 이진파일을 서버에 저장하게 하는 방법이 없기 때문입니다. 해서.. 주로 써드파티 업체에서 제공하는 무료 업로드 컴포넌트를 사용하게 됩니다만...  안정성을 추구하는 업체들이라면 무료보단, 상용을 사용하시는 것이 좋을 겁니다.

가격도 그다지 비싸지 않구 하니까요...  ^^

요즘(2001년) 가장 인기가 좋은 파일 업로드 컴포넌트는 Dext 업로드 컴포넌트가 있는데, 이거 상용입니다. 기업체들은 많이들 이 컴포넌트를 사용합니다만.. 우리의 경우는 돈 주고 그것을 사서 사용하기가 좀 뭐하니까요.. 무료로 제공되는 여러 업로드 컴포넌트 중에 하나를 사용해 보도록 하겠습니다.

얼마전까지는 "사이트갤럭시"라는 업로드 컴포넌트가 가장 많이 사용되고 있었습니다. Freeware 중에서는 말이지요.. 해서 저도 현재 제 사이트의 자료실은 사이트갤럭시로 운영하고 있기도 합니다. 하지만, 아무래도 무료라.. 자잘한 문제들이 많이 발생하고는 하지요... 특히나 Trap 오류가 발생할 가능성이 커지기에.. 최근에는 사이트갤럭시의 사용을 자제하는 움직임도 서서히 보인답니다.

해서, 최근 악어님이 알려주신 훌룡한 컴포넌트인 ABC업로드 컴포넌트로 우리의 강좌를 진행해 볼까 한답니다.
"ABC?  장난하는거야?  이름이 뭐 그따구야.....  " 하실지도 모르겠습니다만.... 상용 컴포넌트와 비교해도 결코 눌리지 않는.. 아니 어쩌면 더 그 기능이 상회하는 컴포넌트라 저는 일단 놀랐습니다. 게다가 도움말까지도 정말로 잘 제공되어져서 공부하기도 어렵지 않더군요... 대단합니다.

아마도 이거 무료로 제공하는 회사는 회사홍보차원에서 이러한 훌룡한 컴포넌트를 그냥 뿌리는 것이 아닌가 하는 .... 오쨋든 감사한 마음으로 우리도 이 컴포넌트를 사용해서 자료실을 구축하는 샘플을 한번 만들어 보도록 하겠습니다.

그렇다면, 도대체 어디서 이 컴포넌트를 구할 수 있을까요?  바로 다음 사이트입니다.

아래 링크에 가시면 여러분은 ABCUpload 를 다운로드 받을 수 있답니다. Free 로 말이지요..  ^^
(버전은 계속 업데이트되니 가장 최신버전을 설치하시면 될 것입니다)

http://www.websupergoo.com/abcupload-1.htm

그것을 여러분의 PC에 설치하시면 됩니다. 설치가 어려울 것은 없어요...  ^^ 그냥 "다음 >" 을 계속 눌러주면 알아서 설치되니까요..  ^^

설치가 완료되고 나면 여러분의 프로그램에 ABCUpload 4 가 추가될 것입니다. 다음 그림과 같이요...

이 컴포넌트에 대한 자세한 설명과 개체의 사용법, ASP에서의 샘플등은 메뉴에서 Documentation을 선택하면... 대단히 자세한 도움말을 볼 수 있습니다. 물론, 영어로 되어져 있어서... 보자마자...

"이런 XX ... 뭐야? 영어잖아.. 뭐가 쉽게 되어져 있다는 거야?"
"장난하지 말고, 태오.. 니가 다 알려줘... 나 영어 못해... 니가 책임지고 알려줘..."

하실 수도 있기는 한데요.. 그럼 안됩니다.  그 정도의 노력도 하지 않고, 감이 떨어지기만을 기다리고 계시면 안되는 것입니다. 적어도 그 도움말의 샘플폴더에 있는 샘플들은 직접 테스트 해 보셔야 합니다.  최소한의 스스로의 노력은 해 보셔야지요..  스스로 하려는 자세가 가장 중요합니다.  의존력을 낮추시고.. 자립성를 키워야 합니다. 그래야 중급 개발자로 올라설 수가 있어요....  혼자서 맨땅에 해딩해가면서 할 수 있는데까지는 해보는 거지요...  그래야 남자답다는 말을 들을 수 있지 않겠습니까???  히~~~  아아.. 여성분은 여자답다는 말을 들을 수 있구요...

다음 그림은 그 도큐먼테이션의 샘플 디렉토리의 모습입니다.  간단한 예제들이 많이 들어있습니다. 그대로만 따라하셔도 잘 될 것입니다..  ^^..  물론, 실제로 사용하실 경우에는 적절히 자신의 환경에 맞게 구성을 하셔야 하기는 합니다...

그럼..  이제 간단하게 샘플을 만들어 볼까요?  자. 여러분의 가상 디렉토리에 샘플로 두개의 파일을 만들어 보겠습니다. 하나는..  업로드할 파일을 지정하는 Form 페이지이구요. 또 하나는 실제로 파일을 업로드하는 ASP 페이지이지요 먼저, Form 페이지인 frm_abc.htm 페이지입니다.

frm_Abc.htm
<HTML>
<HEAD>
<TITLE>Upload Test</TITLE>
</HEAD>
<BODY>
<form name="frmUp" method="post" action="Up_ABC.asp" enctype="multipart/form-data">
<p>이름 : <input type="text" name="name" style="border:1 solid slategray"></p>
<p>파일 : <input type="file" name="attachFile" style="border:1 solid slategray"></p>
<p>전송 : <input type="submit" style="width:150; border:1 solid slategray"></p>
</BODY>
</HTML>

먼저, 각각의 컨트롤의 이름들을 잘 지정해고,  기억해 둡시다. 저의 경우는 name, attachFile 이라고 주었습니다. 사용자의 이름과... 업로드할 파일을 지정하는 컨트롤 각각의 이름을 말이지요.. ^^ 또, 폼 페이지에서 중요한 것이 있다면 그것은 폼의 속성중에 인코딩 타입을 지정하는 것입니다. 이 인코딩 타입을 enctype="multipart/form-data" 로 지정하지 않으면 여러분은 폼을 통해서... 바이너리 데이터를 서버로 전송하지 못합니다. 해서, 여러분이 이진 데이터를 서버로 전달하고 싶을 경우는 반드시..

폼의 속성으로 enctype="multipart/form-data" 를 지정하셔야만 한답니다.  ^^

그런데, 재미있는 것은 여러분이 폼의 속성으로 enctype="multipart/form-data"를 지정해서 데이터를 넘길 경우는 이진 데이터뿐 아니라 일반적인 이름이나 메일주소등을 기입하는 것도 인코딩되어져 넘어가기에.... 위의 경우 사용자의 이름을 ASP 페이지에서 Request("name")과 같은 식으로는 얻어올 수가 없게됩니다... 아예 Request 개체를 사용할 수 없다고 생각하시는것이 어쩌면 맘이 편할 겁니다....

그러면, 어떻게 그 데이터들을 가져올 수 있을까요? 그것의 역할을 하는 것이 바로 업로드 컴포넌트입니다. 대부분의 업로드 컴포넌트는 파일을 업로드하게 해줄 뿐 아니라,  이러한 값들을 얻어올 수 있게 해줍니다. ^^ 자체 메소드를 제공하기에 우리는 Request 대신에 그 컴포넌트의 해당 메소드를 사용하면 됩니다. 사이트갤럭시나 ABCUpload 의 경우는 item 이라는 메소드가 그러한 역할을 하지요.. 곧 만나게 될 것입니다.

그렇다면 이제 위의 폼에서 데이터를 입력했을 경우 서브밋하게 되면 실제적으로 파일을 업로드하고... 처리하는 ASP 페이지를 만들어 봅시다..  ^^

Up_ABC.asp
<html>
<body>
<%
Set theForm = Server.CreateObject("ABCUpload4.XForm")
theForm.AbsolutePath = True
theForm.Overwrite = True

Response.Write "유어 네임 이즈 " & theForm.Item("name") & "<br><br>"

Set theField = theForm.item("attachFile")(1)

If theField.FileExists Then
    theField.Save "E:\Temp\" & theField.safeFileName
    Response.Write "빠일이 업로드 되었습니다...."
Else
    Response.Write "빠일 업로드 실패입니다. 다시 해주쇼..."
End If

%>
</body>
</html>

소스를 세세히 설명하기 전에.... 먼저 소스를 실행해 보세요... 소스중에 "E:\Temp\" 라고 되어져 있는 부분을...  여러분의 하드상에 실제로 있는 폴더로 맞춰주세요.. 에러가 나는 분도 있을 수 있지만,  그럴 경우 대부분이 "쓰기"권한이 없어서 나는 에러일 것입니다. 그런 경우, 업로드가 이루어질 폴더, 위의 소스의 경우(E:\Temp\)의 등록정보에서.. Everyone 에게 쓰기 권한을 주시면  된답니다... 그러면, 잘 실행이 될 것이구요... 다음과 같은 결과를 만나보실 수가 있을 겁니다.

그럼 이제 소스를 하나하나 분석해 볼까요? 제 설명을 들으면서 부족한 부분은 여러분이 직접 Documentation을 살펴보시기 바래요.. 그 도움말이 상당한 도움이 될테니까요..  ^^ 소스의 가장 첫 ASP 구문은 다음 코드로 시작합니다..

Set theForm = Server.CreateObject("ABCUpload4.XForm") 

바로 ABCUpload의 개체 인스턴스를 만들어 주는 부분이지요.  우리는 ABCUpload 를 설치했으므로, 이 객체를 통해서 파일 업로드를 할 수 있게 됩니다. Create 시 반드시 ABCUpload4.XForm 로 만들어야 합니다. 이것이 그 컴포넌트의 프로그램ID 이니까요..  ^^

그리고 난 다음 몇 가지 설정을 합니다. 다음이 그것인데요..

theForm.AbsolutePath = True
theForm.Overwrite = True

AbsolutePath 를 True 로 설정하는 것은 파일이 업로드될 경로로써 물리적인 경로를 사용하고자 하는 경우는 True를 지정하셔야 하구요. 가상경로 즉, 웹상의 경로를 사용하실 경우는 false 로 두시면 됩니다. 우리의 경우는 E:\temp\라는 물리적인 전체경로를 사용할 것이기에 AbsolutePath 를 True로 준 것입니다.

그리고, Overwrite 라는 속성의 값을 또한 True로 주고 있는데요.... 이 값은 만일 Temp 폴더에 이미 업로드하려는 파일과 같은 이름의 파일이 있을 경우는 어떻게 하겠느냐는 속성입니다. 만일, 이 값을 True 로 주면... 같은 이름의 파일을 덮어쓰게 되구요.... 이 값을 False 로 주게되면 같은 이름의 파일이 존재하는데, 업로드하게 될 경우 다음과 같은 에러가 납니다.

어렵지 않죠? 위의 두 설정을 상황에 따라서 여러분이 지정하시면 됩니다. 그 다음으로 이어지는 소스는 아래와 같은데요...

Response.Write "유어 네임 이즈 " & theForm.Item("name") & "<br><br>"

이 소스를 통해서 우리는 Request.Form 과 같은 역할을 하는 메소드가 무엇인지 알수 있답니다. 바로..   ABCUpload 개체의 item 이라는 메소드가 바로 그것이지요...  ABCUpload 의 인스턴스를 theForm라는 이름으로 만들었으니 여러분은 theForm.item("name") 이라고 해서 마치 Reuqest.Form("name")과 같은 효과를 볼 수 있게되는 것입니다.

그러면 다음 코드는 어떤 것을 의미할까요?


Set theField = theForm.item("attachFile")(1)

attachFile 이라는 이름은 파일 컨트롤의 이름이지요?  그러므로,  theForm.item("attachFile")는 바로 바이너리 파일을 의미할 것입니다. 그리고, 이 ABCUplaod 는 같은 이름으로 다중 업로드를 지원하기에...  배열로 사용하는 것이 기본입니다. 해서, theForm.item("attachFile")(1) 라는 것은 attachFile  이라는 이름으로 넘어오는 첫번째 이진 파일자체를 나타내게 됩니다. 만일, 여러분이 폼에서 attachFile 이라는 이름의 컨트롤이 두개가 있었다면 그것들의 데이터를 각각...

theForm.item("attachFile")(1) , theForm.item("attachFile")(2)   와 같이 해서 받아볼 수 있다는 것이지요... 

이 부분에 대해서도 도움말의 Sample 에 자세히 나와있으니 꼭 참고해 보도록 하세요... 자.. 해서 theForm.item("attachFile")(1) 라는 것이 우리가 업로드하려는 파일자체라는 것은 알았습니다. 소스에서는 이 파일을 theFIeld 라는 객체에 담고 있는 것을 볼 수 있을 것입니다.

Set theField = theForm.item("attachFile")(1) 이라는 것은 그것을 말하니까요...

클라이언트가 서버로 보낸 파일을 서버에 저장하기 위해서는 이처럼 각각의 업로드 하고자 하는 파일개체를 먼저 얻어와야 합니다. 해서, 이제 다음 코드로 가볼까요? 이제 어떻게 처리하면 서버에 이 파일이 저장될 수 있을까요?

If theField.FileExists Then
    theField.Save "E:\Temp\" & theField.safeFileName
    Response.Write "빠일이 업로드 되었습니다...."
Else
    Response.Write "빠일 업로드 실패입니다. 다시 해주쇼..."
End If

소스에서는 제일 먼저 theField.FileExists 를 통해서 파일이 제대로 theField 개체에 들어와 있는지를 검사합니다. 만일 해당 파일 전송상태가 좋지 못하거나 해서 파일이 제대로 서버로 업로드 되지 못했다면 FileExists 의 값은 False 가 나올 겁니다. 해서 그런 경우는 "파일 업로드 실패"메시지를 뿌리고 페이지를 끝내구요... 파일이 제대로 업로드해 들어올 경우만 그를 저장하게 하는 것이지요....

theField.Save "E:\Temp\" & theField.safeFileName

이 부분이 바로 실제로 파일을 저장하는 부분입니다. theField 개체의 Save 메소드가 바로 그러한 역할을 담당하구요.. 우리는 물리적인 경로를 지정해서.. 파일을 로컬하드상에 저장하게 하고 있습니다. 여기서 중요한 것이 저장할 파일의 이름을 실제 업로드되는 파일 이름과 똑같게 하시려면 theField.safeFileName 이라는 것을 사용하면 된다는 겁니다. theField.safeFileName 은 사용자가 업로드한 그이름 그대로의 이름으로 파일을 만들어주게 하거든요....  해서 여러분이 소스를 실행하시고 하면 업로드한 파일이 그대로 서버에 업로드된 것을 보실 수 있을 것입니다.

이것이 가장 간단한 파일업로드 방법이었구요.. 이 방법을 토대로 이제 강좌는 진행되어질 것이랍니다...  ^^ 실제로 파일을 업로드 할 경우는 파일이름이 중복되어질 경우의 처리같은 것도 신경을 써야하기에... 그러한 부분도 중요하게 다루어져야 할 것이랍니다..  ^^

그럼... 이제 저랑 약속하나만 합시다.. 그게 뭐냐면요... ABCUploas 도움말에 나와있는 Sample들을 한번 주욱 살펴보자는 겁니다. 같이 스터디하는 기분으로요..  그리 어렵지 않으니 오래걸리지 않아서 다 보실 수 있을 것입니다. 관심이 생기는 분은 소스들을 테스트 해 보심도 좋아보입니다... 그러면 다음 강좌가 더 쉽게 여러분에게 다가설 것입니다. 세상에 쉬운 것은 없습니다만... 미리 준비를 하면 조금은 쉽게 느껴질 수 있을 것입니다....  ^^

그럼 다음 강좌에서 만나요.. 히~~


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})