|
用純ASP代碼實(shí)現(xiàn)圖片上傳并存入數(shù)據(jù)庫中
用ASP編寫網(wǎng)站應(yīng)用程序時間長了,難免會遇到各式各樣的問題,其中
關(guān)于如何上傳文件到服務(wù)器恐怕是遇見最多的問題了,尤其是上傳圖片,比如
你想要在自己的社區(qū)里面實(shí)現(xiàn)類似網(wǎng)易虛擬社區(qū)提供的“每日一星”的功能,
就要提供給網(wǎng)友上傳照片的功能。上傳圖片文件到服務(wù)器可以使用各種免費(fèi)的
文件上傳組件,使用起來功能雖然很強(qiáng)大,但是由于很多情況下,我們只能使
用免費(fèi)的支持ASP的空間或者租用別人的虛擬空間,對于第一種情況,我們
根本就沒有可能來使用文件上傳組件;至于第二種情況,我們也要付出不少的
“銀子”才可以。除非你擁有自己的虛擬主機(jī),你就可以隨便的在服務(wù)器上面
安裝自己所需要的組件,這種情況對于大多數(shù)人來說是可望而不可及的。那我
們就沒有辦法了嗎?呵呵,答案是肯定的(當(dāng)然是肯定的了,要不然我也沒法
寫出這篇文章。O旅婢妥屛覀円黄饋硎褂眉儯粒樱写a來實(shí)現(xiàn)圖片的上傳
以及保存到數(shù)據(jù)庫的功能(順便也實(shí)現(xiàn)顯示數(shù)據(jù)庫中的圖片到網(wǎng)頁上的功
能)。
首先我們先來熟悉一下將要使用的對象方法。我們用來獲取上一個頁面?zhèn)?
遞過來的數(shù)據(jù)一般是使用Request對象。同樣的,我們也可以使用Request對象
來獲取上傳上來的文件數(shù)據(jù),使用的方法是Request.BinaryRead()。而我們要從
數(shù)據(jù)庫中讀出來圖片的數(shù)據(jù)顯示到網(wǎng)頁上面要用到的方法是:
Request.BinaryWrite()。在我們得到了圖片的數(shù)據(jù),要保存到數(shù)據(jù)庫中的時候,
不可以直接使用Insert語句對數(shù)據(jù)庫進(jìn)行操作,而是要使用ADO的
AppendChunk方法,同樣的,讀出數(shù)據(jù)庫中的圖片數(shù)據(jù),要使用GetChunk方
法。各個方法的具體語法如下:
* Request.BinaryRead語法:
variant = Request.BinaryRead(count)
參數(shù)
variant
返回值保存著從客戶端讀取到數(shù)據(jù)。
count
指明要從客戶端讀取的數(shù)據(jù)量大小,這個值小于或者等于使用方法
Request.TotalBytes得到的數(shù)據(jù)量。
* Request.BinaryWrite語法:
Request.BinaryWrite data
參數(shù)
data
要寫入到客戶端瀏覽器中的數(shù)據(jù)包。
* Request.TotalBytes語法:
variant = Request.TotalBytes
參數(shù)
variant
返回從客戶端讀取到數(shù)據(jù)量的字節(jié)數(shù)。
* AppendChunk語法
將數(shù)據(jù)追加到大型文本、二進(jìn)制數(shù)據(jù) Field 或 Parameter 對象。
object.AppendChunk Data
參數(shù)
object Field 或 Parameter 對象
Data 變體型,包含追加到對象中的數(shù)據(jù)。
說明
使用 Field 或 Parameter 對象的 AppendChunk 方法可將長二進(jìn)制或字符數(shù)
據(jù)填寫到對象中。在系統(tǒng)內(nèi)存有限的情況下,可以使用 AppendChunk 方法對長
整型值進(jìn)行部分而非全部的操作。
* GetChunk語法
返回大型文本或二進(jìn)制數(shù)據(jù) Field 對象的全部或部分內(nèi)容 。
variable = field.GetChunk( Size )
返回值
返回變體型。
參數(shù)
Size 長整型表達(dá)式,等于所要檢索的字節(jié)或字符數(shù)。
說明
使用 Field 對象的 GetChunk 方法檢索其部分或全部長二進(jìn)制或字符數(shù)據(jù)。
在系統(tǒng)內(nèi)存有限的情況下,可使用 GetChunk 方法處理部分而非全部的長整型
值。
GetChunk 調(diào)用返回的數(shù)據(jù)將賦給“變量”。如果 Size 大于剩余的數(shù)據(jù),則
GetChunk 僅返回剩余的數(shù)據(jù)而無需用空白填充“變量”。如果字段為空,則
GetChunk 方法返回 Null。
每個后續(xù)的 GetChunk 調(diào)用將檢索從前一次 GetChunk 調(diào)用停止處開始的數(shù)
據(jù)。但是,如果從一個字段檢索數(shù)據(jù)然后在當(dāng)前記錄中設(shè)置或讀取另一個字段
的值,ADO 將認(rèn)為已從第一個字段中檢索出數(shù)據(jù)。如果在第一個字段上再次調(diào)
用 GetChunk 方法,ADO 將把調(diào)用解釋為新的 GetChunk 操作并從記錄的起始
處開始讀取。如果其他 Recordset 對象不是首個 Recordset 對象的副本,則
訪問其中的字段不會破壞 GetChunk 操作。
如果 Field 對象的 Attributes 屬性中的 adFldLong 位設(shè)置為 True,則可
以對該字段使用 GetChunk 方法。
如果在 Field 對象上使用 Getchunk 方法時沒有當(dāng)前記錄,將產(chǎn)生錯誤 3021
(無當(dāng)前記錄)。
接下來,我們就要來設(shè)計我們的數(shù)據(jù)庫了,作為測試我們的數(shù)據(jù)庫結(jié)構(gòu)如
下(Access97):
字段名稱 類型 描述
id 自動編號 主鍵值
img OLE對象 用來保存圖片數(shù)據(jù)
對于在MS SQL Server7中,對應(yīng)的結(jié)構(gòu)如下:
字段名稱 類型 描述
id int(Identity) 主鍵值
img image 用來保存圖片數(shù)據(jù)
現(xiàn)在開始正式編寫我們的純ASP代碼上傳部分了,首先,我們有一個提
供給用戶的上傳界面,可以讓用戶選擇要上傳的圖片。代碼如下
(upload.htm):
<html>
<body>
<center>
<form name="mainForm" enctype="multipart/form-data"
action="process.asp" method=post>
<input type=file name=mefile><br>
<input type=submit name=ok value="OK">
</form>
</center>
</body>
</html>
注意代碼中黑色斜體的部分,一定要在Form中有這個屬性,否則,將無
法得到上傳上來的數(shù)據(jù)。
接下來,我們要在process.asp中對從瀏覽器中獲取的數(shù)據(jù)進(jìn)行必要的處
理,因?yàn)槲覀冊趐rocess.asp中獲取到的數(shù)據(jù)不僅僅包含了我們想要的上傳上來
的圖片的數(shù)據(jù),也包含了其他的無用的信息,我們需要剔除冗余數(shù)據(jù),并將處
理過的圖片數(shù)據(jù)保存到數(shù)據(jù)庫中,這里我們以Access97為例。具體代
碼如下(process.asp):
<%
response.buffer=true
formsize=request.totalbytes
formdata=request.binaryread(formsize)
bncrlf=chrB(13) & chrB(10)
divider=leftB(formdata,clng(instrb(formdata,bncrlf))-1)
datastart=instrb(formdata,bncrlf & bncrlf)+4
dataend=instrb(datastart+1,formdata,divider)-datastart
mydata=midb(formdata,datastart,dataend)
set connGraph=server.CreateObject("ADODB.connection")
connGraph.ConnectionString="driver={Microsoft Access Driver (*.mdb)};DBQ=" &
server.MapPath("images.mdb") & ";uid=;PWD=;"
connGraph.Open
set rec=server.createobject("ADODB.recordset")
rec.Open "SELECT * FROM [images] where id is null",connGraph,1,3
rec.addnew
rec("img").appendchunk mydata
rec.update
rec.close
set rec=nothing
set connGraph=nothing
%>
好了,這下我們就把上傳來的圖片保存到了名為images.mdb的數(shù)據(jù)庫中
了,剩下的工作就是要將數(shù)據(jù)庫中的圖片數(shù)據(jù)顯示到網(wǎng)頁上面了。一般在HT
ML中,顯示圖片都是使用<IMG>標(biāo)簽,也就是<IMG SRC="圖片路徑">,但
是我們的圖片是保存到了數(shù)據(jù)庫中,“圖片路徑”是什么呢?呵呵,其實(shí)這個
SRC屬性除了指定路徑外,也可以這樣使用哦:
<IMG SRC="showimg.asp?id=xxx">
所以,我們所要做的就是在showimg.asp中從數(shù)據(jù)庫中讀出來符合條件的
數(shù)據(jù),并返回到SRC屬性中就可以了,具體代碼如下(showimg.asp):
<%
set connGraph=server.CreateObject("ADODB.connection")
connGraph.ConnectionString="driver={Microsoft Access Driver (*.mdb)};DBQ=" &
server.MapPath("images.mdb") & ";uid=;PWD=;"
connGraph.Open
set rec=server.createobject("ADODB.recordset")
strsql="select img from images where id=" & trim(request("id"))
rec.open strsql,connGraph,1,1
Response.ContentType = "image/*"
Response.BinaryWrite rec("img").getChunk(7500000)
rec.close
set rec=nothing
set connGraph=nothing
%>
注意在輸出到瀏覽器之前一定要指定Response.ContentType = "image/*",
以便正常顯示圖片。
最后要注意的地方是,我的process.asp中作的處理沒有考慮到第一頁
(upload.htm)中還有其他數(shù)據(jù),比如<INPUT type=tesxt name=userid>等等,如果
有這些項(xiàng)目,你的process.asp就要注意處理掉不必要的數(shù)據(jù)。
怎么樣,其實(shí)上傳圖片并保存到數(shù)據(jù)庫很簡單吧,這樣再也不用為自己的
空間無法使用各類的上傳組件發(fā)愁了吧。還等什么?趕快試一試吧。
(以上所有程序均在WinNT4.0英文版,IIS4,Access97/MS SQL Server7.0中運(yùn)
行通過)
|