ABCUpload를 이용해서 파일 업로드를하기 위해서는 사전에 몇가지 준비해야 할 내용들이 있습니다.
음.. 뭐 일단 ABCUpload를 구해서.. (4.1지만 무료고 4.6인가 부터 유료료 전환된걸로 압니다.)
설치하고 IIS에서 업로드 할 폴더 지정해 주고 하는 일을 우선 해야겠죠...
뭐 이부분은 아실꺼라고 믿고 (절대 설명하기 귀찮아서가아닙니다. -_-;;) 넘어가겠습니다.
참.. 제가 설명할 아래 소스는 4.1을 사용해서 무리없이 돌아가는 내용입니다.
우선 입력 페이지 즉 Write.asp 페이지에서 주의해야 할 부분입니다.
<Form Name="폼이름" Method="Post" enctype="multipart/form-data">
<Input type="text" name="Name">
<input type="file" name="upLoadFile" size="58">
</Form>
enctype="multipart/form-data" <== 요녀석을 붙여 줘야 이 폼이 파일을 전송하기 위한
폼이라는 것을 알려 주는 것이죠.
뭐 저 폼안에서 이런 저런 잡다한 내용을 같이 넘겨줄 수도 있겠지만 그건 내용에 따라 틀린거구요
아무튼 저렇게 하고 넘기면 받는 부분이 있겠죠? 그 페이지에서 하는 일은 아래와 같습니다.
Dim FileUpComp, UpFile, UploadFileName, UPloadFileWholePath, Name
DIm DirectoryPath
Set FileUpComp = Server.CreateObject("ABCUpload4.XForm")
Set UPFile = FileUpComp("upLoadFile")(1)
Name = FileUpComp.item("Name")
자 여기를 보시면 이상한 녀석들이 보입니다. 그런데 알고 보면 별것도 아니고
솔직히 꼭 알아야 한다기 보다는 그냥 쓰면 됩니다. 말 그대로 그냥!!
(솔직히 세세한것 까진 모르겠습니다. ㅠㅠ 몰라도 잘 쓰고 있으니까.. 뭐 된건가요? ^^)
Set FileUpComp = Server.CreateObject("ABCUpload4.XForm")은 보이는 것 처럼
파일 업로드를 위한 객체를 생성하는 겁니다.
Set UpFile = FileUpComp("upLoadFile") 은 UpFile 변수에 넘어온 파일을 저장하는 것이구요 넘어온 파일 그 자체를 말이죠...
그리고 한가지 주의할 점이 Write.asp 페이지에서 Form의 속성에 추가했던 부분이 있죠?
enctype="multipart/form-data" 이 녀석으로 Data를 넘겨주면 그동안 잘 사용했던
Request 객체가 통하지 않습니다. 그렇다면 어떻게 하느냐..
위에 Name 값을 가져오는것 보이시죠? 그렇게 받는 겁니다.
Name = FilupComp.item("Name") 여기에서 FilupComp.item 이 바로 Request를 대체하는 부분이죠
아시다시피 원래 Request를 사용할 때도 Request.Form 으로 받는건데 그냥 Request를 사용하는 것처럼 FilupComp.item 역시 FileupComp로 사용하셔도 됩니다.
일단 이렇게 하면 write.asp 페이지에서 넘겨준 값은 전달 받은 상태가 되는겁니다.
If UPFile.FileExists Then
FileUPComp.AbsolutePath = true
DirectoryPath = Server.MapPath("/Upload")
UploadFileName = UPFile.SafeFileName
UPloadFileWholePath = GetUniqueName(UploadFileName, DirectoryPath)
UPFile.Save UPloadFileWholePath
Else
UploadFileName = Null
End If
자.. 이부분이 이제 File을 업로드하는 실질적인 부분이 되는겁니다.
UPFile.FileExists 요건 파일이 넘어 왔는지 여부를 검사하는 거구요 넘어왔으면 저장하기 위한 처리를 시작하고 아니면 그냥 넘어가는거죠
자 그리고 나오는 DirectoryPath = Server.MapPath("/Upload") 요기가 문제인데
여기에서 나오는 Server.MapPath의 의미가 Server에서의 물리적인 경로를 반환하게 됩니다.
음 무슨 의미냐고 하면.. 이건 말이 길어질 것 같으니까.. 따로 포스팅을 하겠습니다.
우선은 그냥 파일이 저장될 폴더를 지정하는 것이다~ 라고만 알고 넘어가죠
UploadFileName = UPFile.SafeFileName 은 파일의 이름을 가져오는 것이구요
뭐 기본적으로 한 폴더 안에는 같은 이름의 파일이 있을수 없기 때문에 파일 중복을 검사하기도 해야하고 정확하게 저장할 폴더까지 말그대로 Upload File의 WholePath를 가져오기 위한
UPloadFileWholePath = GetUniqueName(UploadFileName, DirectoryPath)함수를 호출합니다.
Function GetUniqueName(byRef strFileName, DirectoryPath)
Dim strName, strExt
' 확장자를 제외한 파일명을 얻는다.
strName = Mid(strFileName, 1, InstrRev(strFileName, ".") - 1)
'확장자를 얻는다
strExt = Mid(strFileName, InstrRev(strFileName, ".") + 1)
Dim fso
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Dim bExist : bExist = True
'우선 같은이름의 파일이 존재한다고 가정
Dim UPloadFileWholePath : UPloadFileWholePath = DirectoryPath & "\" & strName & "." & strExt
'저장할 파일의 완전한 이름(완전한 물리적인 경로) 구성
Dim countFileName : countFileName = 0
'파일이 존재할 경우, 이름 뒤에 붙일 숫자를 세팅함.
Do While bExist ' 우선 있다고 생각함.
If (fso.FileExists(UPloadFileWholePath)) Then ' 같은 이름의 파일이 있을 때
countFileName = countFileName + 1 '파일명에 숫자를 붙인 새로운 파일 이름 생성
strFileName = strName & "(" & countFileName & ")." & strExt
UPloadFileWholePath = DirectoryPath & "\" & strFileName
Else
bExist = False
End If
Loop
GetUniqueName = UPloadFileWholePath
End Function
주석을 보셔도 알겠지만 여기에서 처리하는 내용은 파일이 중복되었으면 파일이름(숫자).확장자 형태로 파일이름을 변경해서 저장하기 위한 함수입니다. 특별히 따로 설명해 드릴 부분이 없는것 같습니다.
이상으로 파일을 업로드 하는 로직에 대해서 살펴 봤습니다.
처음 파일 업로드를 처리하기 위해서 이 로직을 봤을때는 무슨 말인지 어떤건지도 모르고 그냥 복사해서 (Ctrl + C) 붙여넣고 (Ctrl + V) 시키는 대로만 해서 사용을 했었죠
뭐 지금은 그때보다 쬐~끔 나아져서 필요한 부분을 추가하거나 수정할 정도는 됐지만 그래도
거의 모든 부분은 알아서 해주니.. ^^
참.. 이 소스의 시작은 저 같은 ASP 프로그래머의 성지라고 할 수 있는 Taeyo's ASP & .net 입니다.