用VB6做一個(gè)簡(jiǎn)單的文件上傳組件(二)
2024-07-21 02:15:40
供稿:網(wǎng)友
 
 
    接著上回,新建一個(gè)activex dlls類型的工程,并將缺省的工程名由“project1”改為“songbird”(當(dāng)然你也有權(quán)不這樣改,呵呵),將缺省的類名由“class1”改為“fileup”,至于為什么要這樣改,以后你便知道了。
    要想實(shí)現(xiàn)讀取上傳文件字節(jié)數(shù)據(jù)的功能,勢(shì)必要涉及到request對(duì)象,可是在vb中該怎么做呢?簡(jiǎn)單,只需要在工程中加入適當(dāng)?shù)念愋蛶?kù)的參考即可。點(diǎn)擊project菜單選擇references,在隨之出現(xiàn)的對(duì)話框中選中microsoft active server pages object項(xiàng)以及microsoft transaction server type library項(xiàng),單擊ok,便可以在vb環(huán)境中象寫asp代碼一樣操縱request、response等對(duì)象了,你會(huì)感到非常親切的。
    以下便是具體的程序代碼:
    public function savefile(pathname as string) as string
        onerror goto errorcode
        dim objcontext as objectcontext
        dim objrequest as request
        'objectcontext的使用類似于asp中的application和session對(duì)象,
        '可以用關(guān)鍵值對(duì)其內(nèi)部的一些特定的對(duì)象實(shí)例進(jìn)行訪問,
        '如objectcontext("response")
        set objcontext=getobjectcontext()
        set objrequest=objcontext("request")
        '以下的一段代碼與前文的腳本程序類似,
        '只不過對(duì)變量的定義要嚴(yán)格些
        dim formdata() as byte,clstr,divstr
        dim datastart as long,datasize as long
        datasize=objrequest.totalbytes
        redim formdata(datasize-1)
        formdata=objrequest.binaryread(datasize)
        clstr=chrb(13) & chrb(10)
        datastart=instrb(formdata,clstr & clstr)+4
        divstr=leftb(formdata,instrb(formdata,clstr)-1)
        datasize=instrb(datastart+1,formdata,divstr)-datastart-2
        formdata=midb(formdata,datastart,datasize)
        '創(chuàng)建一個(gè)二進(jìn)制文件并將formdata寫入其中
        open pathname for binary as 1
        put #1,,formdata
        close #1
        savefile="ok!"
        exit function
    errorcode: savefile=err.description
    end function
    
    大功告成!剩下的便是怎樣使用這段程序了。
    點(diǎn)擊file菜單,選擇make songbird.dll,系統(tǒng)便會(huì)將這段程序編譯成dll文件并自動(dòng)在本機(jī)進(jìn)行注冊(cè)。除非你直接在服務(wù)器上開發(fā),否則應(yīng)將此文件拷貝到nt服務(wù)器的system32目錄下并運(yùn)行“regsvr32 songbird.dll”命令進(jìn)行注冊(cè)。注冊(cè)成功之后,在負(fù)責(zé)接受上傳文件的那個(gè)asp文件中這樣使用該組件:
    <%
      dim fu
      set fu=server.createobject("songbird.fileup")
      '用慣了createobject("adodb.connection"),
      '此時(shí)看見了用自己的大名命名的組件,俺的內(nèi)心立馬充滿了無限的激動(dòng),
      '哈哈哈哈![email protected]#$%&*,對(duì)不起,抒情好象不是俺的強(qiáng)項(xiàng),呵呵
      '將文件保存到服務(wù)器的d盤根目錄下
      response.write fu.savefile("d:/a.gif")
      set fu=nothing
    %>
    ok!希望你在瀏覽器上看到的是“ok!”
    注:
    1、這個(gè)組件只實(shí)現(xiàn)了最最基本的功能,尚不實(shí)用,自己用用、哄哄頭頭也就算了。寫出來的目的只是為了讓感興趣的朋友共享其中一些可資利用的東西。
    2、往nt服務(wù)器上傳文件時(shí),必須確保瀏覽者對(duì)目標(biāo)文件夾至少擁有添加和更改的權(quán)限,否則會(huì)報(bào)“file name or number error”。
    3、在書寫截取文件數(shù)據(jù)的語(yǔ)句時(shí)注意不要搞錯(cuò)字節(jié)數(shù),否則程序運(yùn)行時(shí)并不會(huì)報(bào)錯(cuò),但服務(wù)器收到的只是一堆無用的字節(jié)。
    4、雖然本文是圍繞著上傳一gif圖片文件展開描述的,但無論上傳其它何種類型的文件道理都是一樣的,不用改動(dòng)組件的源程序,只需在使用該組件時(shí)為目標(biāo)文件名指定一正確的擴(kuò)展名即可。