引言
文件的上傳和下載在J2EE編程已經(jīng)是一個(gè)非常古老的話題了,也許您馬上就能掰著指頭數(shù)出好幾個(gè)著名的大件:如SmartUpload、Apache的FileUpload。但如果您的項(xiàng)目是構(gòu)建在Struts+Spring+Hibernate(以下稱SSH)框架上的,這些大件就顯得笨重而滄桑了,SSH提供了一個(gè)簡捷方便的文件上傳下載的方案,我們只需要通過一些配置并輔以少量的代碼就可以完好解決這個(gè)問題了。
本文將圍繞SSH文件上傳下載的主題,向您詳細(xì)講述如何開發(fā)基于SSH的Web程序。SSH各框架的均為當(dāng)前最新版本:
·Struts 1.2
·Spring 1.2.5
·Hibernate 3.0
本文選用的數(shù)據(jù)庫為Oracle 9i,當(dāng)然你可以在不改動(dòng)代碼的情況下,通過配置文件的調(diào)整將其移植到任何具有Blob字段類型的數(shù)據(jù)庫上,如MySQL,SQLServer等。
總體實(shí)現(xiàn)
上傳文件保存到T_FILE表中,T_FILE表結(jié)構(gòu)如下:
![]() 圖 1 T_FILE表結(jié)構(gòu) |
其中:
·FILE_ID:文件ID,32個(gè)字符,用Hibernate的uuid.hex算法生成。
·FILE_NAME:文件名。
·FILE_CONTENT:文件內(nèi)容,對(duì)應(yīng)Oracle的Blob類型。
·REMARK:文件備注。
文件數(shù)據(jù)存儲(chǔ)在Blob類型的FILE_CONTENT表字段上,在Spring中采用OracleLobHandler來處理Lob字段(包括Clob和Blob),由于在程序中不需要引用到oracle數(shù)據(jù)驅(qū)動(dòng)程序的具體類且屏蔽了不同數(shù)據(jù)庫處理Lob字段方法上的差別,從而撤除程序在多數(shù)據(jù)庫移植上的樊籬。
1.首先數(shù)據(jù)表中的Blob字段在Java領(lǐng)域?qū)ο笾新暶鳛閎yte[]類型,而非java.sql.Blob類型。
2.?dāng)?shù)據(jù)表Blob字段在Hibernate持久化映射文件中的type為org.springframework.orm.hibernate3.support.BlobByteArrayType,即Spring所提供的用戶自定義的類型,而非java.sql.Blob。
3.在Spring中使用org.springframework.jdbc.support.lob.OracleLobHandler處理Oracle數(shù)據(jù)庫的Blob類型字段。
通過這樣的設(shè)置和配置,我們就可以象持久化表的一般字段類型一樣處理Blob字段了。
以上是Spring+Hibernate將文件二進(jìn)制數(shù)據(jù)持久化到數(shù)據(jù)庫的解決方案,而Struts通過將表單中file類型的組件映射為ActionForm中類型為org.apache.struts.upload. FormFile的屬性來獲取表單提交的文件數(shù)據(jù)。
綜上所述,我們可以通過圖 2,描繪出SSH處理文件上傳的方案:
![]() 圖 2 SSH處理文件上傳技術(shù)方案 |
文件上傳的頁面如圖 3所示:
![]() 圖 3 文件上傳頁面 |
文件下載的頁面如圖 4所示:
![]() 圖 4 文件下載頁面 |
該工程的資源結(jié)構(gòu)如圖 5所示:
![]() 圖 5 工程資源結(jié)構(gòu) |
工程的類按SSH的層次結(jié)構(gòu)劃分為數(shù)據(jù)持久層、業(yè)務(wù)層和Web層;WEB-INF下的applicationContext.xml為Spring的配置文件,struts-config.xml為Struts的配置文件,file-upload.jsp為文件上傳頁面,file-list.jsp為文件列表頁面。
本文后面的章節(jié)將從數(shù)據(jù)持久層->業(yè)務(wù)層->W(wǎng)eb層的開發(fā)順序,逐層講解文件上傳下載的開發(fā)過程。