摘要:文件的上傳與下載是WEB應(yīng)用開(kāi)發(fā)中的一個(gè)基本需求。本文講述使用PowerBuilder開(kāi)發(fā)COM組件解決WEB應(yīng)用中附件的上傳下載問(wèn)題。
關(guān)鍵詞:WEB應(yīng)用;PowerBuilder;COM組件
隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)的日趨成熟,以及Internet的迅速發(fā)展,對(duì)數(shù)據(jù)庫(kù)信息的處理已經(jīng)漸漸地由Client/Server模式轉(zhuǎn)向Browser/Server模式,基于WEB方式的計(jì)算機(jī)應(yīng)用已是大勢(shì)所趨。開(kāi)發(fā)B/S結(jié)構(gòu)應(yīng)用程序的工具很多,PowerBuilder就是Sybase公司推出的用于企業(yè)級(jí)應(yīng)用的開(kāi)發(fā)工具[1]。
文件的上傳與下載是WEB應(yīng)用開(kāi)發(fā)中的一個(gè)基本需求。本文以示例簡(jiǎn)述PB的WEBFROM下文件上傳與下載的實(shí)現(xiàn),內(nèi)容涉及如何使用PowerBuilder建立WEB應(yīng)用、使用PowerBuilder開(kāi)發(fā)COM組件、PowerBuilder虛擬文件系統(tǒng),以及WEB方式下文件的上傳與下載。
1 PowerBuilder建立WEB應(yīng)用[2]
PowerBuilder的WEB應(yīng)用構(gòu)建前提是分布式應(yīng)用體系。PowerBuilder的客戶端應(yīng)用分布到WEB 服務(wù)器上,可將Web.PB看作為客戶端應(yīng)用。當(dāng)客戶端應(yīng)用Web.PB被WEB 服務(wù)器激活后,調(diào)PowerBuilder的服務(wù)器應(yīng)用,執(zhí)行在服務(wù)器應(yīng)用中定義的方法,實(shí)現(xiàn)業(yè)務(wù)邏輯,如下圖所示:

基于上述原理,本文實(shí)現(xiàn)簡(jiǎn)單的文件上傳下載WEB應(yīng)用,如圖2所示:

上傳按鈕代碼:

下載按鈕代碼:

2 PowerBuilder虛擬文件系統(tǒng)
網(wǎng)頁(yè)部署后,打開(kāi)瀏覽器,輸入U(xiǎn)RL: http://localhost/pb_myweb/進(jìn)行測(cè)試。單擊上傳按鈕后出現(xiàn)的文件上傳頁(yè)面:

選擇文件,單擊Upload按鈕進(jìn)行上傳,上傳成功后顯示如下,可以在文件列表中看到剛上傳的文件信息:

在文件列表中選擇要下載的文件,單擊下載按鈕,出現(xiàn)下面的文件下載保存窗口,選擇要保存的路徑即可:

經(jīng)過(guò)剛才的測(cè)試,上傳與下載的需求似乎已經(jīng)完成了,接下來(lái)我們打開(kāi)一個(gè)新的頁(yè)面,同樣輸入U(xiǎn)RL: http://localhost/pb_myweb/繼續(xù)進(jìn)行測(cè)試,文件列表為空,再次點(diǎn)刷新按鈕也是一樣。文件沒(méi)有傳上去嗎?問(wèn)題出在哪呢?
這里需要先解釋一下PowerBuilder的虛擬文件系統(tǒng):當(dāng)我們部署一個(gè)PB的WEB應(yīng)用后,IIS虛擬目錄下將生成兩個(gè)目錄,如果WEB應(yīng)用的名稱為pb_myweb,則產(chǎn)生的對(duì)應(yīng)目錄為pb_myweb與pb_myweb_root,pb_myweb目錄內(nèi)存儲(chǔ)的是網(wǎng)頁(yè)腳本及所需第三方dll之類,pb_myweb_root目錄提供文件系統(tǒng)、郵件系統(tǒng)、打印系統(tǒng)服務(wù)等服務(wù),而PB的虛擬文件系統(tǒng)目錄對(duì)應(yīng)的就是pb_myweb_root\\File\\Common,Common目錄下的所有子目錄及文件都是針對(duì)web用戶共享的,第一級(jí)子目錄是根據(jù)要部署的WEB應(yīng)用相關(guān)引用文件所在的盤生成的,一般都會(huì)存在兩個(gè)基本的目錄,一個(gè)為pb_myweb_root\\File\\Common\\c\emp,另外一個(gè)為當(dāng)前程序文件所在的目錄,比如我們的程序放在d:\\2010\\web下,則在IIS下的目錄結(jié)構(gòu)為pb_myweb_root\\File\\Common\\d\\2010\\web。
虛擬文件系統(tǒng)中有兩種文件處理模式:共享模式與復(fù)制模式,可以通過(guò)設(shè)置WEB應(yīng)用的PBWEbFileProcessModel屬性進(jìn)行切換,默認(rèn)為共享模式。用戶打開(kāi)瀏覽器進(jìn)行頁(yè)面訪問(wèn)時(shí), WEB應(yīng)用會(huì)根據(jù)每一次新的訪問(wèn)分配唯一的會(huì)話id,并在pb_myweb_root\\file\\session目錄將創(chuàng)建該會(huì)話的臨時(shí)交互目錄,如果會(huì)話id為1234567,則交互目錄為pb_myweb_root\\file\\session\\1234567,實(shí)際的會(huì)話id為由數(shù)字與字母組成的25個(gè)字節(jié)的字符串:

共享模式下,系統(tǒng)將根據(jù)需要將common目錄中的文件復(fù)制到當(dāng)前會(huì)話產(chǎn)生的臨時(shí)交互目錄中,復(fù)制模式下,當(dāng)發(fā)生第一個(gè)對(duì)文件相關(guān)操作時(shí),common目錄下的所有子目錄及文件都會(huì)一次性復(fù)制到當(dāng)前會(huì)話產(chǎn)生的臨時(shí)交互目錄中;系統(tǒng)還提供了一種兼容機(jī)制,如果common目錄下的文件與當(dāng)前會(huì)話中的文件重名的時(shí)候,只會(huì)顯示、處理當(dāng)前會(huì)話目錄中的文件。
用戶的瀏覽器完全關(guān)閉后,當(dāng)前會(huì)話結(jié)束,IIS中有關(guān)該會(huì)話的臨時(shí)交互目錄及所有子目錄、文件都將自動(dòng)清除[3]。
由上述虛擬文件系統(tǒng)的介紹可以得知,每個(gè)用戶打開(kāi)瀏覽器后看到的文件都是基于各自會(huì)話對(duì)應(yīng)的目錄,上傳與下載的目錄也是在各自的會(huì)話目錄中進(jìn)行,且會(huì)話結(jié)束后,上傳的文件也會(huì)被刪除,由Sybase提供的文檔我們也可以得知,web下的filecopy與filemove之類的文件操作函數(shù)調(diào)用也是基于其虛擬文件系統(tǒng),所有的文件操作也只會(huì)在當(dāng)前會(huì)話目錄中,有什么辦法能使文件存儲(chǔ)到實(shí)際的桌面文件系統(tǒng)中指定的目錄嗎?
3 使用PowerBuilder開(kāi)發(fā)COM組件
經(jīng)過(guò)一段時(shí)間的摸索,筆者找到了一種比較好的辦法:通過(guò)com去實(shí)現(xiàn)虛擬文件系統(tǒng)與桌面文件系統(tǒng)的文件互操作,大致的流程是這樣的:通過(guò)web提供的MapVirtualPath函數(shù)到得虛擬文件系統(tǒng)中的文件對(duì)應(yīng)于實(shí)際的桌面文件系統(tǒng)中的路徑,再通過(guò)com組件來(lái)實(shí)現(xiàn)文件在虛擬文件系統(tǒng)與桌面文件系統(tǒng)中的復(fù)制與移動(dòng)操作。這里我們采用PowerBuilder來(lái)編寫所需的com組件,主要設(shè)計(jì)界面及代碼如下:
com組件的一些參數(shù):

文件復(fù)制代碼:

文件移動(dòng)代碼:

目錄創(chuàng)建代碼:

com組件部署時(shí)選擇編譯成功后自動(dòng)注冊(cè)選項(xiàng)就可以了,如下圖:

Web應(yīng)用中的主頁(yè)面增加兩個(gè)函數(shù): of_getname與of_move:
Of_getname函數(shù)用于從指定路徑中取文件名,代碼如下:

Of_move函數(shù)用于將一組文件轉(zhuǎn)移到指定的目錄中,代碼如下:

原來(lái)的myuploadfiles_callback修改如下:

按照原來(lái)的方式上傳三個(gè)文件,結(jié)果如下:

可以看到通過(guò)com組件已經(jīng)把文件中虛擬目錄中轉(zhuǎn)移到桌面文件系統(tǒng)中的指定目錄,編程人員可以利用com組件擴(kuò)充其他的文件操作,以滿足實(shí)際WEB應(yīng)用的需要。
4 結(jié)束語(yǔ)
文件的上傳與下載是WEB應(yīng)用開(kāi)發(fā)中的一個(gè)基本需求,本文以示例簡(jiǎn)述使用PB實(shí)現(xiàn)文件上傳與下載。隨著計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)和數(shù)據(jù)庫(kù)技術(shù)以及Powerbuilder 開(kāi)發(fā)平臺(tái)技術(shù)的發(fā)展,基于WEB的應(yīng)用已是大勢(shì)所趨。因此,掌握新技術(shù)、利用新術(shù),才能開(kāi)發(fā)出滿足用戶需求、適應(yīng)潮流發(fā)展的應(yīng)用程序。
參考文獻(xiàn)
[1]肖兵.PowerBuilder Internet技術(shù)詳解[M].北京:電子工業(yè)出版社,2002.
[2]戴小波.PowerBuilder開(kāi)發(fā)WEB應(yīng)用實(shí)例[J].河北軟件職業(yè)技術(shù)學(xué)院學(xué)報(bào),2005,7(3):61-63.
[3]鄭阿奇.PowerBuilder實(shí)用教程(第3版)[M].北京:電子工業(yè)出社,2009.