用ASPSmartUpload元件實現ASP文件上傳
作者:tank 日期:2006-04-06
用ASPSmartUpload元件實現ASP文件上傳
文件上傳對於網站後臺管理而言是一個很重要的功能。我們在上傳文件的同時,可以把文件名、文件類型、版本、文件大小、下載路徑、文件說明等相關訊息保存在資料庫中,用資料庫的強大功能來管理各種類型的文件,包括對
文件進行關鍵字匹配檢索。
目前使用得最廣泛的網頁開發技術非微軟的ASP莫屬,但遺憾的是ASP卻沒有文件上傳功能,我們只能通過第三方元件來實現。事實上,的確有不少元件可以支持ASP文件上傳,甚至還有開發者研究出了無元件上傳的方法。但縱觀這些技術,總有這樣或那樣的缺點,要麼使用太複雜,不易控制;要麼需要付費,免費的功能太簡單,無法深入地控制。
筆者在本文裡向大家介紹的這款文件上傳元件----ASPSmartUpload,是由ASPSmart公司開發的,它功能強大,更重要的是它是完全免費的,非常符合我們「不花錢、多辦事」的要求,是一個非常優秀的文件上傳元件。簡要地說,它有如下特點:
● 可限制上傳單一文件的大小及多個文件的全部大小
● 一次可上傳多個文件
● 可同時傳送一般的表彰字段與文件
● 可將上傳文件(如圖形文件、ZIP文件等)寫入資料庫
● 可限制上傳文件的類型
● 允許從資料庫或文件取回先前上傳的內容
下面我們先來看一看ASPSmartUpload對象的使用方法和屬性。
一、 註冊ASPSmartUpload元件
要在ASP頁面中使用ASPSmartUpload元件,首先需要在使用它的機器上註冊。註冊的步驟很簡單:
1、 將下載的ASPSmartUpload.zip解壓縮到某個目錄,如c:\temp,由於ASPSmartUpload無法自動安裝,所以在找到ASPSmartUpload.dll之後,需要手工在DOS方式下或「開始/運行」鍵入命令:
regsvr32.exe c:\temp\ASPSmartUpload.dll
系統會彈出一個窗口顯示成功註冊訊息。
2、 接下來複製另一個dll文件ASPSmartUploadUtil.dll到windows\system32目錄下,此時就完成了ASPSmartUpload元件的註冊與安裝。
二、 ASPSmartUpload對像簡介
1、SmartUpload對象的屬性和方法
SmartUpload對象可以在ASP中直接被創建,其語法為:
Set myUpload = server.CreateObject(「ASPSmartUpload.SmartUpload」)
myUpload.Collections | Properties | Methods
SmartUpload對象的主要屬性與方法一覽表:
屬性/方法 |
說明 |
屬性 | |
TotalMaxFileSize |
允許上傳的全部檔的大小 |
MaxFileSize |
允許上傳的單個檔的大小 |
AllowedFilesList |
允許上傳的檔類型列表 |
DeniedFilesList |
禁止上傳的檔類型列表 |
DownloadBlockSize |
一次讀取檔的大小 |
TotalBytes |
POST表單中的大小(以位元組為單位) |
方法 | |
Upload |
上傳POST表單 |
Save |
保存上傳檔到指定目錄 |
DownloadFile |
下載一個檔 |
DownloadField |
從資料庫中下載先前上傳的文件 |
FieldToFile |
將檔上傳到資料庫中 |
UploadInFile |
將POST表單保存到檔中 |
SmartUpload有兩個集合,分別是Files集合和Form集合,其層次關係為:
ASPSmartUpload
Files
file
Form
item
2、Files對象的屬性和方法
myFiles.Collection | Properties | Method
它只有一個集合,為file集合。
Files對象的主要屬性與方法一覽表:
屬性/方法 |
說明 |
屬性 | |
Count |
檔物件的個數 |
TotalBytes |
檔集合的大小(以位元組為單位) |
方法 | |
Item(ID) |
缺省方法,返回指定帶有指定ID的檔物件 |
File對象的調用語法:
myFile.Properties | Methods
file對象的主要屬性與方法一覽表:
屬性/方法 |
說明 |
屬性 | |
Name |
POST表單項名 |
FileName |
用戶鍵入的檔案名 |
FileExt |
用戶鍵入的檔尾碼 |
FilePathName |
用戶鍵入的檔路徑 |
ContentType |
用戶鍵入的檔類型 |
Size |
文件大小 |
IsMissing |
若未指定檔則為真 |
TypeMIME |
用戶鍵入的MIME類型 |
Count |
檔物件的個數 |
TotalBytes |
檔集合的大小(以位元組為單位) |
方法 | |
SaveAs |
保存檔(覆蓋檔案名相同的檔) |
FileToField |
上傳檔到資料庫 |
三、 多個文件上傳
對ASPSmartUpload元件及其屬性方法有了初步的瞭解後,我們來動手開發一個允許多個文件上傳的頁面,在上傳的同時還可以給各個文件加上說明。
一般的HTML標記即可上傳文件,只要將FORM標記的ENCTYPE屬性賦為「multipart/form-data」值即可。在下面的例子中,我們最多可以同時上傳四個文件。我們假定上傳目錄為當前目錄下的upload子目錄,由於要往upload目錄中寫入文件,因此必須將該目錄中everyone的安全權限設為「修改」或「完全控制」。
表單文件upload_1.htm:
<script language=vbscript>
sub datacheck()
if upload.file01.value = Empty then
MsgBox "文件名不能為空!",64,"Oh no!"
focusto(0)
exit sub
end if
upload.submit
end sub
sub focusto(x)
document.upload.elements(x).focus()
end sub
</script>
<body>
<form method="post" name="upload" action="upload_1.asp" enctype="multipart/form-data">
文件名:<input type=file size=50 name="file01"><br>
說明:<input type=text size=50 name="disc1"><p>
文件名:<input type=file size=50 name="file02"><br>
說明:<input type=text size=50 name="disc2"><p>
文件名:<input type=file size=50 name="file03"><br>
說明:<input type=text size=50 name="disc3"><p>
文件名:<input type=file size=50 name="file04"><br>
說明:<input type=text size=50 name="disc4"><p>
<input type=button value="upload now!" onclick="datacheck">
</form>
在用戶指定文件名、按了「upload now!」按鈕後,會激發後端的ASP程式upload_1.asp實現上傳操作,代碼見下。筆者在代碼中添加了詳細的註釋,相信應該不難理解。
文件upload_1.asp:
<%
sub show_files()
on Error Resume Next
'定義上傳目錄
const dirUpload = "upload"
set objUpload = server.CreateObject("aspSmartUpload.SmartUpload")
'限制最大上傳字節數
objUpload.TotalMaxFileSize = 300000
『限制文件上傳類型為文本與圖像
'objUpload.AllowedFilesList = "txt,jpg,gif"
『文件上傳
objUpload.Upload
'保存文件在upload目錄,同時取得上傳的文件數
intNo = objUpload.save(dirUpload)
『如果Err值=0,則說明上傳成功
if Err <> 0 then
response.write "上傳文件錯誤: <font color=ff0000>"&Err.Description&"</font>"
else
response.write "共上傳了 <font color=ff0000><b>"&intNo&"</b></font> 個文件!<p>"
response.write "分別是:<br>"
nPoint = 1
『遍歷files集合,取出上傳文件的屬性
for each thefile in objUpload.files
'如果上傳文件不為空
if thefile.fileName <> Empty then
'先輸出FORM中的input名,如file01、file02等
response.write thefile.Name&" = <font color=0000ff><b>"
'輸出文件名(不含路徑)
response.write thefile.fileName&" </b></font>("
'輸出各個文件的字節數
response.write FormatNumber(thefile.size,0)&"bytes)<br>"
response.write "說明:<font color=silver>"&objUpload.Form.Item("disc"&nPoint)&"</font><p>"
nPoint = nPoint+1
end if
Next
response.write "<p>上傳總字節數:"&"<font color=0000ff><b>"&objUpload.files.Totalbytes&"</b></font><br>"
response.write "可上傳的最大文件數:"&"<font color=0000ff><b>"&objUpload.files.count&"</b></font><br>"
response.write "<hr>"
end if
end sub
%>
<body>
<% show_files %>
</body>
四、 上傳文件到資料庫
上面的例子是將文件上傳到伺服器的目錄中。ASPSmartUpload元件還支持將文件上傳到資料庫。筆者以圖像文件為例,向大家詳細講解如何將文件上傳到SQL Server資料庫。我們假定資料庫所在伺服器的IP地址為10.98.3.2,上傳文件保存在資料庫ASP的upload表中。
表單文件:upload_2.htm
<script language="VBScript">
dim intType
sub datacheck()
dim strType
if upload.file1.value = Empty then
MsgBox "文件名不能為空!",64,"Oh no!"
focusto(0)
Exit sub
end if
『通過單選鈕的值來判斷用戶輸入的文件類型是否為用戶選中的類型
if upload.file1.value <> Empty then
select case intType
case 2
strType = "jpg"
case 3
strType = "bmp"
case else
strType = "gif"
end select
『將用戶輸入的文件名的後綴與選中的文件類型相比,如果不同,則用戶需要上傳的文件類型與
『用戶在單選鈕中選中的類型不相同,拒絕上傳。
if lCase(right(Trim(upload.file1.value),3)) <> strType then
Msgbox "選取的圖形文件格式("&strType&") 不相符!",64,"oh no!"
focusto(3)
Exit Sub
end if
end if
upload.submit
end sub
sub focusto(x)
document.upload.elements(x).focus()
end sub
</script>
<body>
<div align=center>上傳圖片到資料庫</div>
<p>
<form method="post" name="upload" action="upload_2.asp" enctype="multipart/form-data">
圖形文件類型:
<input type=radio name=itype value="gif" onClick="intType=1" checked> GIF
<input type=radio name=itype value="jpg" onClick="intType=2"> JPG
<input type=radio name=itype value="bmp" onClick="intType=3"> BMP
文件名:<input type=file size=50 name="file1"><br>
文本說明:<input type=text size=50 name="desc1"><hr>
文件名:<input type=file size=50 name="file2"><br>
文本說明:<input type=text size=50 name="desc2"><hr>
文件名:<input type=file size=50 name="file3"><br>
文本說明:<input type=text size=50 name="desc3"><hr>
文件名:<input type=file size=50 name="file4"><br>
文本說明:<input type=text size=50 name="desc4"><hr>
<input type=button value="上傳文件" onclick="datacheck">
</form>
upload_2.asp文件:
<%
dim strDSN,adocon
sub insert_DB()
const dirUpload = "upload"
set objUpload = Server.CreateObject("AspSmartUpload.SmartUpload")
'單個文件最大為100K
objUpload.MaxFileSize = 100000
objUpload.upload
'保存文件,並取出實際上傳的文件數
intNo = objUpload.save(dirUpload)
on Error Resume Next
'資料源字串
strDSN = "Driver={SQL Server};Server=10.98.3.2;uid=sa;pwd=;database=asp;autotranslate=no;"
'取出文件類型
strType = objUpload.form("itype")
'通過Select獲得最新的ID值
newid = get_NewID(strDSN)
'將初始的ID值作個備份,在螢幕上顯示時會用到
newid_list = newid
set rs = Server.CreateObject("ADODB.RecordSet")
rs.open "upload",adocon,1,3
nCount = 1
for each file in objUpload.files
'如果沒有指定文件,則 file.IsMissing 為真
if not file.IsMissing then
『添加一條記錄
rs.addnew
rs("id") = newid
rs("path") = file.FileName
rs("descrp") = objUpload.Form("desc"&nCount)
rs("trans_date") = now
rs("imgtype") = strType
『利用file的FileToField方法將文件保存在資料庫中
file.FileToField rs("urimage")
rs.update
newid = newid+1
nCount = nCount+1
end if
Next
rs.close:set rs = nothing
if Err <> 0 then
Response.write "上傳文件錯誤: <font color=ff0000>"&Err.Description&"</font>"
else
response.write "上傳成功!<p>文件是:<br>"
for each file in objUpload.files
if file.filename <> Empty then
response.write "ID = <font color=ff0000>"&newid_list&"</font>,"
response.write file.name&" = <font color=0000ff><b>"&file.filename&"</b></font> ("&formatNumber(File.size,0)&" bytes)<br>"
newid_list = newid_list+1
end if
next
response.write "<hr>"
end if
end sub
『取出表upload中的最大ID值
function get_NewID(strDSN)
set adocon = Server.CreateObject("ADODB.Connection")
adocon.open strDSN
set rs1 = adocon.Execute("select id from upload order by id desc")
if not rs1.eof then
get_newID = rs1("id")+1
else
get_NewID = 1
end if
rs1.close:set rs1 = nothing
end function
%>
<body>
<% insert_DB %>
通過上面的例子可以看出,用ASPSmartUpload元件進行文件上傳,其實只需要三行語句:
set objUpload = Server.CreateObject("AspSmartUpload.SmartUpload")
objUpload.upload
intNo = objUpload.save(「upload」)
如果您對文件上傳的控制不是很嚴格,那麼只需要這三條語句就可以了。如果您想對上傳進行嚴格的控制管理,如限制上傳文件的大小、文件類型、存放目錄等,ASPSmartUpload元件也完全能夠做得到。再配合資料庫,您可以對文件上傳實行賬號權限管理,嚴格分發各個帳戶所具有的不同的上傳權力,避免惡意用戶無限制地上傳垃圾文件繼而堵塞網路,撐爆伺服器硬碟,充分保證網路的暢通與伺服器的安全。