• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Welcome to 陳俊峰's ---BeetleHeaded Man Blog !

              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              58 隨筆 :: 32 文章 :: 18 評(píng)論 :: 0 Trackbacks

            用ASP編寫(xiě)網(wǎng)站應(yīng)用程序時(shí)間長(zhǎng)了,難免會(huì)遇到各式各樣的問(wèn)題,其中關(guān)于如何上傳文件到服
            務(wù)器恐怕是遇見(jiàn)最多的問(wèn)題了,尤其是上傳圖片,比如你想要在自己的社區(qū)里面實(shí)現(xiàn)類(lèi)似網(wǎng)易
            虛擬社區(qū) 提供的“每日一星”的功能,就要提供給網(wǎng)友上傳照片的功能。上傳圖片文件到服務(wù)
            器可以使用各種免費(fèi)的文件上傳組件,使用起來(lái)功能雖然很強(qiáng)大,但是由于很多情況下,我們
            只能使用免費(fèi)的支持ASP的空間或者租用別人的虛擬空間,對(duì)于第一種情況,我們根本就沒(méi)
            有可能來(lái)使用文件上傳組件;至于第二種情況,我們也要付出不少的“銀子”才可以。除非你
            擁有自己的虛擬主機(jī),你就可以隨便的在服務(wù)器上面安裝自己所需要的組件,這種情況對(duì)于大
            多數(shù)人來(lái)說(shuō)是可望而不可及的。那我們就沒(méi)有辦法了嗎?呵呵,答案是肯定的(當(dāng)然是肯定的
            了,要不然我也沒(méi)法寫(xiě)出這篇文章啊)。下面就讓我們一起來(lái)使用純ASP代碼來(lái)實(shí)現(xiàn)圖片的
            上傳以及保存到數(shù)據(jù)庫(kù)的功能(順便也實(shí)現(xiàn)顯示數(shù)據(jù)庫(kù)中的圖片到網(wǎng)頁(yè)上的功能)。


               首先我們先來(lái)熟悉一下將要使用的對(duì)象方法。我們用來(lái)獲取上一個(gè)頁(yè)面?zhèn)鬟f過(guò)來(lái)的數(shù)據(jù)一
            般是使用Request對(duì)象。同樣的,我們也可以使用Request對(duì)象來(lái)獲取上傳上來(lái)的文件數(shù)據(jù),使
            用的方法是Request.BinaryRead()。而我們要從數(shù)據(jù)庫(kù)中讀出來(lái)圖片的數(shù)據(jù)顯示到網(wǎng)頁(yè)上面要
            用到的方法是:
            Request.BinaryWrite()。在我們得到了圖片的數(shù)據(jù),要保存到數(shù)據(jù)庫(kù)中的時(shí)候,不可以直接
            使用Insert語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,而是要使用ADO的AppendChunk方法,同樣的,讀出數(shù)據(jù)庫(kù)
            中的圖片數(shù)據(jù),要使用GetChunk方法。各個(gè)方法的具體語(yǔ)法如下:
            *Request.BinaryRead語(yǔ)法:
            variant=Request.BinaryRead(count)
            參數(shù)
            variant
            返回值保存著從客戶(hù)端讀取到數(shù)據(jù)。
            count
            指明要從客戶(hù)端讀取的數(shù)據(jù)量大小,這個(gè)值小于或者等于使用方法Request.TotalBytes得到的
            數(shù)據(jù)量。
            *Request.BinaryWrite語(yǔ)法:
            Request.BinaryWritedata
            參數(shù)
            data
            要寫(xiě)入到客戶(hù)端瀏覽器中的數(shù)據(jù)包。
            *Request.TotalBytes語(yǔ)法:
            variant=Request.TotalBytes
            參數(shù)
            variant
            返回從客戶(hù)端讀取到數(shù)據(jù)量的字節(jié)數(shù)。
            *AppendChunk語(yǔ)法
            將數(shù)據(jù)追加到大型文本、二進(jìn)制數(shù)據(jù)Field或Parameter對(duì)象。
            object.AppendChunkData
            參數(shù)
            objectField或Parameter對(duì)象
            Data變體型,包含追加到對(duì)象中的數(shù)據(jù)。
            說(shuō)明
            使用Field或Parameter對(duì)象的AppendChunk方法可將長(zhǎng)二進(jìn)制或字符數(shù)
               據(jù)填寫(xiě)到對(duì)象中。在系統(tǒng)內(nèi)存有限的情況下,可以使用AppendChunk方法對(duì)長(zhǎng)整型值進(jìn)行
            部分而非全部的操作。
            *GetChunk語(yǔ)法
            返回大型文本或二進(jìn)制數(shù)據(jù)Field對(duì)象的全部或部分內(nèi)容。
            variable=field.GetChunk(Size)
            返回值
            返回變體型。
            參數(shù)
            Size長(zhǎng)整型表達(dá)式,等于所要檢索的字節(jié)或字符數(shù)。
            說(shuō)明
               使用Field對(duì)象的GetChunk方法檢索其部分或全部長(zhǎng)二進(jìn)制或字符數(shù)據(jù)。在系統(tǒng)內(nèi)存有限
            的情況下,可使用GetChunk方法處理部分而非全部的長(zhǎng)整型值。
            GetChunk調(diào)用返回的數(shù)據(jù)將賦給“變量”。如果Size大于剩余的數(shù)據(jù),則
            GetChunk僅返回剩余的數(shù)據(jù)而無(wú)需用空白填充“變量”。如果字段為空,則
            GetChunk方法返回Null。
               每個(gè)后續(xù)的GetChunk調(diào)用將檢索從前一次GetChunk調(diào)用停止處開(kāi)始的數(shù)據(jù)。但是,如果從
            一個(gè)字段檢索數(shù)據(jù)然后在當(dāng)前記錄中設(shè)置或讀取另一個(gè)字段的值,ADO將認(rèn)為已從第一個(gè)字段
            中檢索出數(shù)據(jù)。如果在第一個(gè)字段上再次調(diào)用GetChunk方法,ADO將把調(diào)用解釋為新的GetChu
            nk操作并從記錄的起始處開(kāi)始讀取。如果其他Recordset對(duì)象不是首個(gè)Recordset對(duì)象的副本,
            則訪(fǎng)問(wèn)其中的字段不會(huì)破壞GetChunk操作。
            如果Field對(duì)象的Attributes屬性中的adFldLong位設(shè)置為T(mén)rue,則可以對(duì)該字段使用GetChun
            k方法。
            如果在Field對(duì)象上使用Getchunk方法時(shí)沒(méi)有當(dāng)前記錄,將產(chǎn)生錯(cuò)誤3021(無(wú)當(dāng)前記錄)。
               接下來(lái),我們就要來(lái)設(shè)計(jì)我們的數(shù)據(jù)庫(kù)了,作為測(cè)試我們的數(shù)據(jù)庫(kù)結(jié)構(gòu)如下(Access200
            0):


            字段名稱(chēng)    類(lèi)型    描述
               id   自動(dòng)編號(hào)   主鍵值
            img OLE對(duì)象   用來(lái)保存圖片數(shù)據(jù) 


            對(duì)于在MSSQLServer7中,對(duì)應(yīng)的結(jié)構(gòu)如下:
            字段名稱(chēng)    類(lèi)型    描述
               id    int(Identity)  主鍵值
            img   image    用來(lái)保存圖片數(shù)據(jù)
            現(xiàn)在開(kāi)始正式編寫(xiě)我們的純ASP代碼上傳部分了,首先,我們有一個(gè)提供給用戶(hù)的上傳界面
            ,可以讓用戶(hù)選擇要上傳的圖片。代碼如下
            (upload.htm):
            <html>
            <body>
            <center>
            <form name="mainForm" enctype="multipart/form-data" action="process.asp" method=p
            ost>
               <inputtype=filename=mefile><br>
               <inputtype=submitname=okvalue="OK">
            </form>
            </center>
            </body>
            </html>
            注意enctype="multipart/form-data",一定要在Form中有這個(gè)屬性,否則,將無(wú)法得到上傳
            上來(lái)的數(shù)據(jù)。接下來(lái),我們要在process.asp中對(duì)從瀏覽器中獲取的數(shù)據(jù)進(jìn)行必要的處理,因
            為我們?cè)趐rocess.asp中獲取到的數(shù)據(jù)不僅僅包含了我們想要的上傳上來(lái)的圖片的數(shù)據(jù),也包
            含了其他的無(wú)用的信息,我們需要剔除冗余數(shù)據(jù),并將處理過(guò)的圖片數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中,這
            里我們以access2000為例。具體代碼如下(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)
            setconnGraph=server.CreateObject("ADODB.connection")
            connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&server.Ma
            pPath("images.mdb")&";uid=;PWD=;"
            connGraph.Open
            setrec=server.createobject("ADODB.recordset")
            rec.Open"SELECT*FROM[images]whereidisnull",connGraph,1,3
            rec.addnew
            rec("img").appendchunkmydata
            rec.update
            rec.close
            setrec=nothing
            setconnGraph=nothing
            %>
            好了,這下我們就把上傳來(lái)的圖片保存到了名為images.mdb的數(shù)據(jù)庫(kù)中了,剩下的工作就是要
            將數(shù)據(jù)庫(kù)中的圖片數(shù)據(jù)顯示到網(wǎng)頁(yè)上面了。一般在HTML中,顯示圖片都是使用<IMG>標(biāo)簽
            ,也就是<IMGSRC="圖片路徑">,但是我們的圖片是保存到了數(shù)據(jù)庫(kù)中,“圖片路徑”是什么
            呢?呵呵,其實(shí)這個(gè)SRC屬性除了指定路徑外,也可以這樣使用哦:
            <IMGSRC="showimg.asp?id=xxx">
            所以,我們所要做的就是在showimg.asp中從數(shù)據(jù)庫(kù)中讀出來(lái)符合條件的
            數(shù)據(jù),并返回到SRC屬性中就可以了,具體代碼如下(showimg.asp):
            <%
            setconnGraph=server.CreateObject("ADODB.connection")
            connGraph.ConnectionString="driver={MicrosoftAccessDriver(*.mdb)};DBQ="&
            server.MapPath("images.mdb")&";uid=;PWD=;"
            connGraph.Open
            setrec=server.createobject("ADODB.recordset")
            strsql="selectimgfromimageswhereid="&trim(request("id"))
            rec.openstrsql,connGraph,1,1
            Response.ContentType="image/*"
            Response.BinaryWriterec("img").getChunk(7500000)
            rec.close
            setrec=nothing
            setconnGraph=nothing
            %>
            注意在輸出到瀏覽器之前一定要指定Response.ContentType="image/*",
            以便正常顯示圖片。
            最后要注意的地方是,我的process.asp中作的處理沒(méi)有考慮到第一頁(yè)(upload.htm)中還有其
            他數(shù)據(jù),比如<INPUT type=tesxt name=userid>等等,如果有這些項(xiàng)目,你的process.asp就
            要注意處理掉不必要的數(shù)據(jù)。

            posted on 2006-05-10 10:54 Jeff-Chen 閱讀(477) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): ASP.NET

            評(píng)論

            # re: ASP實(shí)現(xiàn)圖片上傳 2006-11-06 11:39 kjl
            如何將字段中的照片數(shù)據(jù)還原成文件  回復(fù)  更多評(píng)論
              

            久久精品卫校国产小美女| 久久国产欧美日韩精品| 久久精品无码一区二区三区日韩 | 国产成人香蕉久久久久| 久久不见久久见免费影院www日本| 久久久久久久综合综合狠狠| 中文字幕久久久久人妻| 午夜不卡888久久| 香蕉久久夜色精品国产尤物| 久久亚洲私人国产精品vA| 精品无码久久久久久国产| 欧美午夜精品久久久久免费视| 久久精品国产精品青草| 久久久久久久女国产乱让韩| 久久国产精品久久国产精品| 国产精品亚洲综合久久| 精品久久久久久国产三级 | 久久久久国产精品| 国产精品美女久久福利网站| 草草久久久无码国产专区| 日韩乱码人妻无码中文字幕久久| 久久精品亚洲欧美日韩久久| 国产精品99久久免费观看| 亚洲国产精品无码成人片久久| 久久久久亚洲AV综合波多野结衣 | 久久精品青青草原伊人| 久久无码人妻精品一区二区三区| 东京热TOKYO综合久久精品| 国内精品久久久久久久久电影网| 久久国产三级无码一区二区| 久久这里只有精品18| 一本色道久久88—综合亚洲精品| 青青草国产97免久久费观看| 99久久精品免费观看国产| 国产精品狼人久久久久影院| 一级做a爱片久久毛片| 国产AV影片久久久久久| 久久99精品国产麻豆蜜芽| 久久国产精品一区| 2021国产精品午夜久久| 丁香色欲久久久久久综合网|