■ "SiteGalaxyUpload 컴포넌트" 설치

자료실을 구축하기 위해서 "SiteGalaxyUpload 컴포넌트"를 설치해야 합니다.
http://www.geocities.com/sitegalaxy/ 에서 구할 수 있습니다.
컴포넌트를 설치한 후 SiteGalaxyUpload 컴포넌트에서 제공해 주는 객체(object)들을 사용할 수 있습니다.


■ 파일올리기 연습

SiteGalaxyUpload 컴포넌트를 사용해서 파일을 클라이언트에서 서버로 원격 업로드 하는 방법을 알아 보도록 하자. 먼저 파일이 올라갈 폴더(C:\temp)를 만든다. 만약 NT의 경우라면(NTFS) 모든사람에게 쓰기권한까지 해 주어야 한다.

<HTML>
<HEAD>

<TITLE>파일업하기 연습</TITLE>

</HEAD>

<BODY>

<FORM action="upload_ok.asp" method=post encType="multipart/form-data" >

업로드할 파일 찾아보기: <INPUT name=file type=file>
<INPUT type="submit" value="파일올리기">

</form>

</BODY>

</html>


먼저 위와 같이 입력 폼을 만든다. 주의해야 할 점은 <form>태그에 encType="multipart/form-data" 를 넣어야 한다는 것이다.
enctype은 내용을 송신할 경우에 사용되는 타입으로 기본타입은 application/x-www-form-urlencodeed 고, 이것을 이용해서 CGI를 실행하는데 input 테그에 type=file 이 들어갈 경우에는 encType="multipart/form-da 로 지정해야한다

<% set up = Server.CreateObject("SiteGalaxyUpload.Form")
set fs = server.CreateObject("Scripting.FileSystemObject")
fn = "c:\temp\" & fs.GetFileName(up("file").FilePath)
up("file").SaveAs(fn)
%>
<html>
<body>
up("file").FilePath(올릴파일의 경로) : <%=up("file").FilePath%> <br>
fn(저장될 파일의 경로) : <%= fn %>
</body>
</html>
<% set fs = Nothing
set up = Nothing %>


SiteGalaxyUpload.Form객체의 인스턴스를 up로 만들고 FSO객체의 인스턴스를 fs로 만들었다.
up("file")은 upload.htm에서 넘긴 파일 경로를 받아오게 된다.
up("imagefile").FilePath 는 upload.htm에서 넘긴 파일 경로를 받아오게 된다
GetFileName는 FSO객체의 메소드로 파일의 이름을 반환하게 된다.
fn이라는 변수에는 파일이 저장될 서버의 절대경로가 지정이 되여지게 되며, SaveAS라는 메소드에서 파일을서버에 저장을 하게 된다.
주의할 점은 윈도우NT 사용자라면 NTFS로 포맷이 된 드라이브는 해당폴더(c:\temp)의 사용권한을 모든 사람이 쓸수 있도록 변경해야만 한다
upload후 c:\temp폴더를 확인하면 결과를 알수 있을 것이다.

 

■ 자료실 테이블 작성

Access파일에 data라는 이름으로 테이블을 추가한다.



테이블의 구조를 보면 기존의 게시판테이블(board)에

 

1. 자료실 쓰기 폼 만들기(write.htm)

기존의 게시판의 글올리기 폼에서 자료를 선택할 수 있는 부분이 첨가된 것이다.
Form태그에 ENCTYPE="MULTIPART/FORM-DATA" 를 추가해야만 파일업로드가 가능하다.
<form action="upload.asp" method="post" ENCTYPE="MULTIPART/FORM-DATA" >
<table width="600" border="1" cellspacing="0" cellpadding="7" align="center" bordercolor="
2. 자료실 쓰기 실제 수행(upload.asp)

write.htm에서 이름, 글제목, 글내용, 파일을 입력 받을 것을 upload.asp에서 실제적으로 서버에 파일을 업로드를 하고 DB에 글을 저장하게 된다.
(아래 프로그래밍에서는 C:\TEMP)에 저장되는 것으로 프로그래밍되어 있다
실제 저장될 폴더를 만들고, 만약 NTFS로 포맷이 되었다면 폴더에 쓰기 권한을 주어야만 파일을 쓸수 있다.

<%
set Up = Server.CreateObject("SiteGalaxyUpload.Form")
name = Up("name") ' name이라는 변수에 write.htm에서 받은 값을 저장한다.
email = Up("email")
homepage = Up("homepage")
content = Up("content")
title = Up("title")
pwd = Up("pwd")
file = Up("file")

'---------------------- 첨부파일이 있을 때만 파일 업로드 작업시작----------------------------
if Len(file) > 0 then


'업로드 크기 제한 - 2MByte까지
if Up("file").Size > 2000*1024 then
Response.Redirect "upload_fail.asp"
End If
Set fs = CreateObject("Scripting.FileSystemObject")
'---------------------------------------------------------------------------
' 같은 파일명이 있을 경우 처리 시작(올리는 파일명 뒤에 일련번호를 넣어준다.)
FileName = fs.GetFileName(up("file").FilePath)
strName = Mid(FileName, 1, Instr(FileName, ".") - 1) ' 확장자를 제외한 파일명을 얻는다.
strExt = Mid(FileName, Instr(FileName, ".") + 1) '확장자를 얻는다.

bExist = True ' 우선 같은이름의 파일이 존재한다고 가정
countFileName = 0 ' 파일이 존재할 경우, 이름 뒤에 붙일 숫자를 세팅함.
FileName = "c:\temp\" & FileName
Do While bExist ' 우선 있다고 생각함.


If (fs.FileExists(FileName)) Then ' 같은 이름의 파일이 있을 때

countFileName = countFileName + 1 '파일명에 숫자를 붙인 새로운 파일 이름 생성
FileName = "c:\temp\" & strName & "_" & countFileName & "." & strExt
Else '같은 이름의 파일이 없을 때
bExist = False ' 파일이 존재하지 않으므로.
End If
Loop
'------------------------------------------------------------------------------------
' 같은 파일명이 있을 경우 처리 시작 끝
Size = Up("file").Size
Up("file").SaveAs FileName ' 파일을 실제로 저장한다.
FileName = fs.GetFileName(FileName) '파일명에는 경로가 들어가 있으므로 이경로를 없앤다
'다운로드시 경로가 있으면 문제가 생김
set FS = Nothing

' 파일의 크기를 kb단위로 보여주기 위해 사용되는 코딩
temp = CLng(Size)
If temp > 1024 Then '1024byte(1Kbyte)보다 크면
temp=temp / 1024
Size = CStr(CInt(temp)) & "K"
End If



end if
'----------------------첨부파일이 있을 경우의 작업 끝----------------------------------------------

Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "MySiteDB"
strSQL = "Select MAX(num) from data"
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open strSQL, objConn

strSQL = "Insert into data(name,title,email,file_size,content, file_name,pwd,writeday,homepage) "
strSQL = strSQL& " values('" & name & "','" & title & "','" & email & "','" & Size & "','" & content
strSQL = strSQL & "','" & FileName & "','" & pwd & "','"& date & "','"&homepage&"')"

objConn.Execute(strSQL)
objConn.Close
Set objConn = Nothing
set Up = Nothing '이 객체를 이용해서 받은 값의 이용이 다 끝났을 경우에 이 객체를 버린다
response.redirect "list.asp" ' 자바를 이용해 이동할 경우 refresh된 페이지를 보여주는 것이
'아니라 기존의 페이지를 보여주므로 rediect문을 이용하여 페이지를 이동한다
%>


■ 자료실 목록(list.asp)

목록은 게시판의 목록과 거의 비슷하며 파일첨부 처리만 해 주면 되겠다. 제목부분(content.asp)와 첨부파일(upload.asp)로 링크가 되어 있다. 둘다 마찬가지로 DB테이블의 board_idx값을 넘겨 주게 된다. 이래에 코딩된 페이지에서는 페이지를 나누는 기능이 없고 화면구성이 짜임새 있게 마무리된 상태가 아니므로 기존의 게시판 코딩을 이용해 화면구성을 다듬고 페이지를 나누는 기능을 추가하는 것이 좋다

<%
Set conn = Server.CreateObject ("ADODB.Connection")
conn.Open ("MySiteDB")
Set rs = Server.CreateObject ("ADODB.Recordset")
strSQL = "Select * from data Order by num DESC"
rs.Open strSQL, conn, 1
%>

<html>
<head><title>자료실</title></head>
<body bgcolor="

※ 문제
1. 위의 코딩에 페이지 분할 기능을 추가해 넣자
2. 다운로드된 수를 저장하기 위해 필드를 하나 더 추가해 보자 (이 필드를 추가 하게 되면 db가 변경되는 것이 므로 거의 모든 작업에서 이 필드에 관한 조작을 추가해 넣어야 한다)
3. 파일의 확장자를 분석해서 각각의 확장자에 맞는 아이콘을 파일명 앞에 붙여 놓자 (zip파일은 zip파일을 의미하는 아이콘으로)

■ 자료실 내용보기(content.asp)


자료실의 내용보기는 게시판의 내용보기에 첨부파일부분만 처리해 주면 된다.

<%
Set conn = Server.CreateObject ("ADODB.Connection")
conn.Open ("MySiteDB")
UpdateSQL = "Update data Set readnum = readnum + 1 where board_idx =" & request("idx")
conn.Execute UpdateSQL

Set rs = Server.CreateObject("ADODB.Recordset")
SQL = "SELECT * FROM data where board_idx=" & request("idx")
rs.Open SQL,conn,1
content = replace(rs("content"),chr(13) & chr(10),"<br>")%>

<html>
<body bgcolor="

<table width="600" border="1" cellspacing="0" cellpadding="7" align="center" bordercolor="

 목록과 마찬가지로 확장자별 이미지를 처리해 주고 파일정보를 게시판의 내용보기처럼 보여주고 있다.

 

■ 자료실 내려받기(download.asp)

URL에 선택된 파일을 붙여서 다운로드가 이루어지게 된다. 여기서 이전에 만든 서버의 파일저장 공간(C:\temp)는 가상디렉토리로 설정이 되어야만 가능하다. 그래서 아래 코드는 C:\temp폴더를 data라는 가상디렉토리로 IIS에서 등록해 놓 았다는 전제하에 작성된 것이다

<%
Set conn = Server.CreateObject ("ADODB.Connection")
conn.Open ("MySiteDB")
Set rs = Server.CreateObject ("ADODB.Recordset")
idx = Request.QueryString ("idx")
strSQL = "Select * from data where board_idx=" &idx
rs.Open strSQL, conn,1
URL = "http://210.90.238.39/data/" & rs("file_name")
Response.Redirect URL
rs.Close
conn.close
%>
<script language=javascript>
history.back
</script>


.

 

■ 자료 삭제하기(del.asp, del-ok.asp)

일단 비밀번호를 입력 받아 pwd라는 변수 이름으로 del_ok.asp로 보낸다. 여기서 주의해야 할 점은 게시물의 고유번호인 idx값을 넘겨준다
action="pds_del_ok.asp?idx=<%=request("idx")%>" 와 같은 표현 대신 <input type=hidden>을 이용해 인덱스키값을 넘겨 줘도 된다

<html>

<head>

<title>자료실 삭제</title>

</head>

<body>

<form action="pds_del_ok.asp?idx=<%=request("idx")%>" method="post" >

암호:<INPUT type="password" name="pwd">

<input type="submit" name="submit" value=" 삭 제 ">

<A href="list.asp">&lt;리스트로 돌아가기&gt;</A>

</form>

</body>


 삭제시 num값에 대한 조작이 없기 때문에 list로 돌아와 보면 삭제된 번호가 그래로 반영되어 보이지 않는다.
이런 부분을 수정하고자 경우에는 list.asp를 수정해주거나 이곳에서 num값을 update해 주는 것이 좋다

<%
set db= Server.CreateObject("ADODB.Connection")
db.Open("MySiteDB")
Set rs=Server.CreateObject("ADODB.RecordSet")
SQL1 = "Select * from data Where board_idx =" &request("idx")
rs.Open SQL1,db,1
If Request("pwd") = rs("pwd") Then '암호가 일치하면 등록된 파일 삭제
Set objFS = Server.CreateObject("Scripting.FileSystemObject")
DeleteFile = "c:\temp\" & rs("File_Name")
If objFS.FileExists (DeleteFile) then 'upload되어 있는 파일 삭제
objFs.DeleteFile DeleteFile
End If

'DB에서 레코드 삭제
strSQL = "Delete from data where board_idx = " &request("idx")
db.Execute strSQL
Response.Redirect "list.asp"
Else %>
<script language = "javascript">
alert("암호가 맞지 않습니다.다시 확인해보세요~!");
history.back();
</script>
<%End If%>

+ Recent posts