用純ASP代碼實現圖片上傳並存入數據庫中

用ASP編寫網站應用程序時間長了,不免會遇到各式各樣的問題,其中 

關於如何上傳文件到服務器恐怕是碰見最多的問題了,尤爲是上傳圖片,好比 

你想要在本身的社區裏面實現相似網易虛擬社區提供的「每日一星」的功能, 

就要提供給網友上傳照片的功能。上傳圖片文件到服務器可使用各類免費的
html

文件上傳組件,使用起來功能雖然很強大,可是因爲不少狀況下,咱們只能使 

用免費的支持ASP的空間或者租用別人的虛擬空間,對於第一種狀況,咱們 

根本就沒有可能來使用文件上傳組件;至於第二種狀況,咱們也要付出很多的 

「銀子」才能夠。除非你擁有本身的虛擬主機,你就能夠隨便的在服務器上面 

安裝本身所須要的組件,這種狀況對於大多數人來講是可望而不可及的。那我 

們就沒有辦法了嗎?呵呵,答案是確定的(固然是確定的了,要否則我也無法 

寫出這篇文章啊)。下面就讓咱們一塊兒來使用純ASP代碼來實現圖片的上傳 

以及保存到數據庫的功能(順便也實現顯示數據庫中的圖片到網頁上的功 

能)。 
sql

首先咱們先來熟悉一下將要使用的對象方法。咱們用來獲取上一個頁面傳 

遞過來的數據通常是使用Request對象。一樣的,咱們也可使用Request對象 

來獲取上傳上來的文件數據,使用的方法是Request.BinaryRead()。而咱們要從 

數據庫中讀出來圖片的數據顯示到網頁上面要用到的方法是: 

Request.BinaryWrite()。在咱們獲得了圖片的數據,要保存到數據庫中的時候, 

不能夠直接使用Insert語句對數據庫進行操做,而是要使用ADO的 

AppendChunk方法,一樣的,讀出數據庫中的圖片數據,要使用GetChunk方 

法。各個方法的具體語法以下:
數據庫

* Request.BinaryRead語法: 

variant = Request.BinaryRead(count) 

參數 

variant 

返回值保存着從客戶端讀取到數據。 

count 

指明要從客戶端讀取的數據量大小,這個值小於或者等於使用方法 

Request.TotalBytes獲得的數據量。 

* Request.BinaryWrite語法: 

Request.BinaryWrite data 

參數 

data 

要寫入到客戶端瀏覽器中的數據包。 

* Request.TotalBytes語法: 

variant = Request.TotalBytes 

參數 

variant 

返回從客戶端讀取到數據量的字節數。 

* AppendChunk語法 

將數據追加到大型文本、二進制數據 Field 或 Parameter 對象。 

object.AppendChunk Data 

參數 

object Field 或 Parameter 對象 

Data 變體型,包含追加到對象中的數據。 

說明 

使用 Field 或 Parameter 對象的 AppendChunk 方法可將長二進制或字符數 

據填寫到對象中。在系統內存有限的狀況下,可使用 AppendChunk 方法對長 

整型值進行部分而非所有的操做。 

* GetChunk語法 

返回大型文本或二進制數據 Field 對象的所有或部份內容 。 

variable = field.GetChunk( Size ) 

返回值 

返回變體型。 

參數 

Size 長整型表達式,等於所要檢索的字節或字符數。 

說明 

使用 Field 對象的 GetChunk 方法檢索其部分或所有長二進制或字符數據。 

在系統內存有限的狀況下,可以使用 GetChunk 方法處理部分而非所有的長整型 

值。 

GetChunk 調用返回的數據將賦給「變量」。若是 Size 大於剩餘的數據,則 

GetChunk 僅返回剩餘的數據而無需用空白填充「變量」。若是字段爲空,則 

GetChunk 方法返回 Null。 

每一個後續的 GetChunk 調用將檢索從前一次 GetChunk 調用中止處開始的數 

據。可是,若是從一個字段檢索數據而後在當前記錄中設置或讀取另外一個字段 

的值,ADO 將認爲已從第一個字段中檢索出數據。若是在第一個字段上再次調 

用 GetChunk 方法,ADO 將把調用解釋爲新的 GetChunk 操做並從記錄的起始 

處開始讀取。若是其餘 Recordset 對象不是首個 Recordset 對象的副本,則 

訪問其中的字段不會破壞 GetChunk 操做。 

若是 Field 對象的 Attributes 屬性中的 adFldLong 位設置爲 True,則可 

以對該字段使用 GetChunk 方法。 

若是在 Field 對象上使用 Getchunk 方法時沒有當前記錄,將產生錯誤 3021 

(無當前記錄)。 
瀏覽器

ActualSize屬性,是字段內容的長度

接下來,咱們就要來設計咱們的數據庫了,做爲測試咱們的數據庫結構如 

下(Access97): 

字段名稱    類型    描述 

  id    自動編號   主鍵值 

img OLE對象   用來保存圖片數據  



對於在MS SQL Server7中,對應的結構以下: 

字段名稱    類型    描述 

  id     int(Identity) 主鍵值 

img   image     用來保存圖片數據  



如今開始正式編寫咱們的純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中有這個屬性,不然,將無 

法獲得上傳上來的數據。 

接下來,咱們要在process.asp中對從瀏覽器中獲取的數據進行必要的處 

理,由於咱們在process.asp中獲取到的數據不只僅包含了咱們想要的上傳上來 

的圖片的數據,也包含了其餘的無用的信息,咱們須要剔除冗餘數據,並將處 

理過的圖片數據保存到數據庫中,這裏咱們以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的數據庫中 

了,剩下的工做就是要將數據庫中的圖片數據顯示到網頁上面了。通常在HT 

ML中,顯示圖片都是使用<IMG>標籤,也就是<IMG SRC="圖片路徑">,但 

是咱們的圖片是保存到了數據庫中,「圖片路徑」是什麼呢?呵呵,其實這個 

SRC屬性除了指定路徑外,也能夠這樣使用哦: 

<IMG SRC="showimg.asp?id=xxx"> 

因此,咱們所要作的就是在showimg.asp中從數據庫中讀出來符合條件的 

數據,並返回到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(rec("img").ActualSize) 

rec.close 

set rec=nothing 

set connGraph=nothing 

%> 

注意在輸出到瀏覽器以前必定要指定Response.ContentType = "image/*", 

以便正常顯示圖片。 

最後要注意的地方是,個人process.asp中做的處理沒有考慮到第一頁 

(upload.htm)中還有其餘數據,好比<INPUT type=tesxt name=userid>等等,若是 

有這些項目,你的process.asp就要注意處理掉沒必要要的數據。 

怎麼樣,其實上傳圖片並保存到數據庫很簡單吧,這樣不再用爲本身的 

空間沒法使用各種的上傳組件發愁了吧。還等什麼?趕快試一試吧。 



(以上全部程序均在WinNT4.0英文版,IIS4,Access97/MS SQL Server7.0中運 

行經過)
服務器

相關文章
相關標籤/搜索