我在用ASP為某個單位製作網頁時遇到這樣一個問題,單位以前的MIS系統中將一些Word檔案以位元組流的形式保存在資料庫中,現在使用者要求我用ASP將這些Word檔案資料從資料庫中取出並在網頁中顯示。開始我自然地想到在伺服器上創建臨時文件、然後在網頁中增加一個指向這個臨時文件的鏈接,但這個方法將大大增加服務器的負擔不說,而且在服務上如何保證特定客戶端所使用的臨時文件不被其它客戶端使用的文件覆蓋,如何在文件傳送給用戶後將文件刪除,這些問題在實際都難以很好解決。那麼有沒有更好的辦法呢?
為此我仔細查看了一下ASP的參考書,發現Response物件有一個叫做contenttype的屬性,它定義伺服器傳送給客戶端內容的MIME類型。 MIME全名為Multipurpose Internet Mail Extensions,即多功能Internet郵件擴充。我們知道,在網頁程式設計中我們有時會將超連結指向一個Word或Excel文件,當使用者點擊這個連結時瀏覽器會自動呼叫對應方法將這個文件開啟。之所以能做到這一點就是因為使用者機器上安裝office後會在瀏覽器中註冊對應的MIME資源類型。比方說word檔案的MIME型別是Application/msword(前者是MIME型,後者是MIME子類別),Excel檔案的MIME資源型別是Application/msexcel。事實上,凡是瀏覽器能處理的所有資源都有對應的MIME資源類型,比如說html檔案的MIME類型是Text/html,JPG檔案的MIME類型是Image/JPG。在與伺服器的互動中,瀏覽器就是根據所接受資料的MIME類型來判斷要進行什麼樣的處理,對html、JPG等檔案瀏覽器直接將其打開,對Word、Excel等瀏覽器本身無法開啟的文件則呼叫對應方法開啟。對沒有標記MIME類型的文件,瀏覽器則根據其副檔名和文件內容猜測其類型。如果瀏覽器無法猜出,則將它作為application/octet-stream。若要了解各種檔案的MIME類型,請在win98 我的電腦->檢視->資料夾選項->檔案類型中查看。
於是我靈機一動,想到在ASP中可以先將WORD資料以位元組流方式取出,接著將其conntenttype屬性標記為Application/msword,再將它發送給客戶機,客戶機收到這個資源後,根據其MIME類型,會自動呼叫客戶機上的Word(當然,前提是客戶機上裝了Word,否則會將其作為一個不能識別的資源,提示用戶保存起來,而不是打開它)將它打開。經試驗效果很好,方法簡單且速度很快,而且在IE5中瀏覽器使用內嵌方式(類似OLE方式)打開,效果更佳。以下是程式內容。
假設表名tab_word,表中有兩個字段,一個是整型,名id,用作Word資料的唯一標識,另一個Blob型,名worddata,裡面存放Word資料。現在要在頁面上顯示id等於1的Word檔案內容, ASP程式如下:
< %
' conn - 已建立的資料庫連接
' rs -- 結果集
rs = conn.execute(select
worddata from tab_word where id = 1)
response.contenttype = Application/msword
response.writebinary(rs(worddata))
'注意將結果集中的資料直接用writebinary發送出去,不要用變數
'接收這個數據,否則系統會報錯
% >
用類似的方法,還可以處理Excel、Bmp等許多類型的資料。