用ASPSmartUpload元件實現ASP文件上傳

穩萊

用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元件也完全能夠做得到。再配合資料庫,您可以對文件上傳實行賬號權限管理,嚴格分發各個帳戶所具有的不同的上傳權力,避免惡意用戶無限制地上傳垃圾文件繼而堵塞網路,撐爆伺服器硬碟,充分保證網路的暢通與伺服器的安全。
 
 

 給當前日誌評分:
Loading Vote
正在讀取評分資料...


文章來自: Tank部落格
引用通告: 查看所有引用 | 我要引用此文章
Tags: ASPSmartUpload
相關日誌:

評論: 1 | 引用: 0 | 查看次數: -
回覆回覆不能用中文[2010-08-18 11:12 AM | del]
是很好用,但[b]不支援中文檔名[/b]就遜掉了
發表評論
暱 稱:
密 碼: 遊客發言不需要密碼.
內 容:
驗證碼: 驗證碼
選 項:
雖然發表評論不用註冊,但是為了保護您的發言權,建議您註冊帳號.