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

來源:互聯網
上載者:User
用ASP編寫網站應用程式程式時間長了,難免會遇到各式各樣的問題,其中關於如何上傳檔案到伺服器恐怕是遇見最多的問題了,尤其是上傳圖片,比如你想要在自己的社區裡面實作類別似網易虛擬社區提供的“每日一星”的功能,就要提供給網友上傳照片的功能。上傳圖片檔案到伺服器可以使用各種免費的檔案上傳組件,使用起來功能雖然很強大,但是由於很多情況下,我們只能使用免費的支援ASP的空間或者租用別人的虛擬空間,對於第一種情況,我們根本就沒有可能來使用檔案上傳組件;至於第二種情況,我們也要付出不少的“銀子”才可以。除非你擁有自己的虛擬機器主機,你就可以隨便的在伺服器上面安裝自己所需要的組件,這種情況對於大多數人來說是可望而不可及的。那我們就沒有辦法了嗎?呵呵,答案是肯定的(當然是肯定的了,要不然我也沒法寫出這篇文章啊)。下面就讓我們一起來使用純ASP代碼來實現圖片的上傳以及儲存到資料庫的功能(順便也實現顯示資料庫中的圖片到網頁上的功能)。

  首先我們先來熟悉一下將要使用的對象方法。我們用來擷取上一個頁面傳遞過來的資料一般是使用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(無目前記錄)。接下來,我們就要來設計我們的資料庫了,作為測試我們的資料庫結構如下(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>

   < 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的資料庫中了,剩下的工作就是要將資料庫中的圖片資料顯示到網頁上面了。一般在HTML中,顯示圖片都是使用標籤,也就是,但是我們的圖片是儲存到了資料庫中,“圖片路徑”是什麼呢?呵呵,其實這個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(7500000)

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中運行通過)



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.