用VB6做一個簡單的檔案上傳組件(一)

來源:互聯網
上載者:User
最近在單位做的一個項目裡需要有檔案上傳的功能,正好手頭一本書的附贈光碟片裡有一個上傳組件,心中大喜。可惜隨之便發現這是一個試用版,不給錢就只能用50次,太小氣了!!好在頭頭催得不緊,時間充裕,乾脆自己試著做一個,既可長經驗值,又能長成就感,不試白不試!以下介紹的便是俺折騰了兩天半搗鼓出來的一個只能說是雛形的玩意,區區三十行代碼,大俠們不要笑俺哦,這隻是寫給與俺一樣好奇心強但經驗值低的弟兄們看的。
    檔案上傳所需的第一步當然是進入一個有“file”表單元素的頁面,具體就不說了,大家都知道。但是若想做一個能夠接受該檔案並且將其儲存到伺服器硬碟上的組件,必須知道所提交的未經處理資料的怎麼一個模樣才行。做到這一點並不難:
    <%
      Dim FormData,FormSize
      FormSize=Request.TotalBytes
      FormData=Request.BinaryRead(FormSize)
      Response.BinaryWrite FormData
    %>
    因為需要讀取的是前一個頁面提交來的原始位元組資料,因此不能使用Request.Form()方法,必須使用BinaryRead方法,並且一旦使用了這個方法,就不能再在同一個頁面中使用Form()方法了,反之亦然。基於同樣的道理,向頁面輸出時也必須使用BinaryWrite方法,不過這並不妨礙你繼續使用Response.Write方法。
    在下面的描述中假設瀏覽者選擇上傳的檔案是一個GIF圖片,你會發現這段代碼啟動並執行結果並不是在瀏覽器上顯示出這幅圖片,而只是輸出了一堆基本上是亂七八糟的字元:

-----------------------------7ce20d227c0232
Content-Disposition: form-data; name="file"; filename="C:\mypic.gif"
Content-Type: image/gif

GIF89a    垐??!?倇挌7昳€聉}$撾頓藶排湃缺哪澆爬⒖咯技Φ檔北發創熍皗獂勃姰畾棩ゥ撾頓藶排湃缺哪澆爬⒖咯技Φ檔北發創熍皗獂勃姰畾棩ゥゥ挗|櫃櫇潒櫃嚈櫃殦x敂儘崓潅倢寍檱Z杹r?杽Z剟剠厁儍t??p{{{zzszzlsss媙arrj僯jrre€ccfff乨Xfffddjj^fffddZ__UZZZYYSWWMRRRRRJ_BBKKK?IIB? ??W::AAA?S;?-----------------------------7ce20d227c0232--

    不奇怪,這就對了!因為未經處理資料並不僅僅是圖片檔案本身的資料,它還包含有對該檔案在使用者硬碟上的路徑、類型、提交頁面的表單網域名稱等相關資訊的描述,以及頭尾兩段基本相同的標識(即“-----------------------------7ce20d227c0232”),我想這對標識應該是在表單中含有多個元素時起分割作用的。中間的那段資料,即以“GIF89a”開頭,直到最後一個“;”,才是我們所想得到的GIF圖片檔案的資料。若想讓瀏覽器能夠顯示出這幅圖片,當然得先把這些不需要的內容去掉再向頁面輸出。因此下面該做些什麼就很明了了。
    第一步,掐頭:
    “頭”與圖片資料的分界線就是兩對斷行符號分行符號(在瀏覽器中是看不到“GIF89a”之前的那個空白行的,得把輸出結果粘貼到寫字板裡去研究,記事本也不行)。
    Dim DataStart,CLStr
    CLStr=ChrB(13) & ChrB(10)
    DataStart=InStrB(FormData,CLStr & CLStr)+4
    其中的4是兩對斷行符號分行符號的長度,另外要注意這裡都是在針對位元組資料進行操作,而不是字元,因此不要用錯了函數,少敲了個“B”就完全得不到正確結果了。
    第二步,去尾:
    “頭”有多大算是搞清了,那尾呢?不急,先擷取開頭那段標識的具體內容,注意它的結尾處是一對斷行符號分行符號:
    Dim DivStr
    DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1)
    因為我們將要使用MidB方法截取圖片資料,所以接下來需要搞清楚整段圖片資料的位元組數,就用前面已定義了的DataSize變數:
    DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2
    為什麼要減2呢?因為末尾那段標識之前也有一對斷行符號分行符號。至此,圖片資料便可以很輕易地得到並在瀏覽器上輸出了:
    FormData=MidB(FormData,DataStart,DataSize)
    Response.BinaryWrite FormData
    不過我想你一定不會滿足於到此為止的,因為還沒有存檔呢!當然我也不會做到這裡便收工,否則是沒法向頭頭交差的。前面所探討的這些內容都還只局限在純粹的ASP指令碼程式範圍內,並沒有涉及到組件技術。其實我一開始並沒有想向這方面努力,只想靠ASP解決問題,可惜FileSystemObject沒告訴我它可以往硬碟上寫二進位檔案,在這個論壇上問了半天也沒人睬我,只好自己動手編組件了。
    不過接下來的過程並不像想象中的那樣艱難。
    所要做的這個組件的功能很簡單,只提供了一個方法:SaveFile(Pathname),在這個方法內,程式首先擷取上傳頁面所提交的檔案的位元組資料,就象前文所述的指令碼程式一樣,然後再將這些資料寫到伺服器硬碟上由參數Pathname所指定的一個二進位檔案內,一切便大功告成了,至於如何使這個組件進一步完善些,呵呵,以後慢慢來吧。
    具體怎麼做呢?開啟VB,然後請聽下回分解。


相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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