最近我接手了一個項目,它將一個保修申請(Warranty Claim)系統搬到網上。項目的重頭戲是儲存和保修申請有關的映像。我選用的組件包括:
· 一個資料庫表來儲存映像
· 一個ASP網頁來上傳映像
· 一個指令碼用於解釋上傳的映像,並把它們儲存到表中
· 一個網頁用於查看與選定的申請號碼對應的映像名稱
· 一個網頁用於顯示實際映像
下面來仔細研究一下應用程式的每個組件。
表
由於我只是想快速驗證一下方案的可行性,所以使用的是Microsoft Access,而不是SQL Server、Oracle或者MySQL等更可靠的資料庫。由於要處理的資訊肯定不止保修申請和映像,所以表中也肯定不止包含2列,如圖A所示。這些列是的含義是不言而喻的,惟一值得一提的就是映像的內容類型(content_type),它是指圖形檔案的資料類型。OLE Object用於取代二進位大對象(BLOB),因為我們使用的是Access。
圖A
上傳頁面
得到這份工作後,我花了約10分鐘的時間思索怎樣從用戶端將一個檔案上傳到ASP伺服器。後來,我想起HTML input元素有一個type屬性,它可設為file。同時也想起了accept屬性,它有助於根據MIME類型來篩選列出的檔案。但遺憾的是,這種實現品質不是很高。
form元素是上傳頁面中的最後一個“用戶端”部分。該元素由於牽涉到檔案上傳,所以必然要進行特殊處理,具體就是將method屬性設為post,並將enctype屬性設為multipart/form-data,這是一次性發送多個檔案的標準做法。最後,在使用用戶端javascript的情況下,為了確保文本與檔案在表單提交時是分離的,我為表單的action屬性添加了申請號碼(claim number)。圖B展示了最終的網頁,代碼如清單A所示。
圖B
伺服器端指令碼
表單被提交後,表單的action屬性所指定的指令碼將獲得控制權。該指令碼決定以後要採取的操作。後期工作實際很簡單,因為申請號碼、所有檔案以及這些檔案的屬性都是由用戶端一次性發送過來的。還可採取程式化的方式分離這些資料,但我選擇使用aspSmart免費提供的aspSmartUpload組件來分離不同的檔案。該組件包括文檔和樣本,極大簡化了我的工作。
aspSmartUpload組件的Files對象提供了一個方法來訪問集合中的單獨檔案。每個檔案的屬性是用File對象來檢索的,這些屬性包括檔案名稱、MIME類型、MIME子類型以及檔案本身。
映像列表和顯示
如果同時根據申請號碼和檔案名稱來列出映像,要比單純顯示映像合理得多。這樣一來,撥號使用者就可選擇自己需要的一幅映像,而不至於使頻寬吃緊。考慮到這一點,我建立了如圖C所示的網頁。它的代碼如清單B所示。
圖C
通常,當一幅映像在網頁上顯示時,映像本身是來源於一個檔案的。例如,內容類型是根據副檔名而確定的,比如whatever.jpeg或者stuff.gif。但遺憾的是,由於映像儲存在一個表中,所以我們無法享受這一便利。不過,我們的優勢在於已經掌握了內容類型。
在由快顯視窗、一個IFrame或者一個Frame調用的指令碼中,可利用內容類型來設定Response對象的內容類型,並將映像以二進位形式寫入,具體方式如下:
Response.ContentType = rsImage("content_type")
Response.BinaryWritersImage("picture")
清單C展示了細節。
不要被實現細節阻撓
一般人最開始都知道這個項目肯定能實現,但等具體做起來,才發現實現細節嚴重影響了自己的進度。碰到這種情況,不要灰心,只有步步為營,才能最終取得成功。