1. 引言
每位Web開(kāi)發(fā)者在工程中都必須實(shí)現至少實(shí)現一個(gè)客戶(hù)文件的上載功能。永遠需要!然而,要求用戶(hù)僅提供一個(gè)指向其數據的URL是不公平的。作為一個(gè)開(kāi)發(fā)者,幫助用戶(hù)順利地完成這些正是你的工作。HTTP協(xié)議的使用將十分有助于解決這個(gè)問(wèn)題,但是許多開(kāi)發(fā)者并沒(méi)有選擇使用HTTP協(xié)議。
你需要解決的問(wèn)題有:存儲上載的文件并找到關(guān)于問(wèn)題"Where?","Why?"和"How?"等等的有關(guān)答案。
本文將解釋所有在解決這些問(wèn)題中遇到的瓶頸,并提供了功能性的、易于理解的代碼,這些內容很可能會(huì )應用于你將來(lái)的工程中。
2. 準備工作
本文將使用當前最流行的開(kāi)發(fā)工具,它們是:
·應用程序服務(wù)器:WebLogic 8.1 SP3服務(wù)器
·基于Java的構建工具:Apache Ant 1.6.2
·數據庫服務(wù)器:MySQL 4.0.16
·用于從Java連接到MySQL的:MySQL Connector/J 3.1.7
Struts 1.2.4用作構建Java Web應用程序的框架,而Hibernate 3.0(RC1)用于對象/關(guān)系持續性操作和查詢(xún)服務(wù)。
本文雖然基于Windows平臺寫(xiě)成,但在其它操作系統之上,應該稍作修改就能運行。
另外,讀者還應熟悉BEA WebLogic服務(wù)器以及使用Struts和Hibernate進(jìn)行J2EE應用程序的開(kāi)發(fā)。篇幅所限,本文并沒(méi)有討論關(guān)于應用程序和數據庫服務(wù)器配置的問(wèn)題。
3. 上載工程分析
現在讓我們討論存儲上載文件的機制,并回答上面列出的三個(gè)問(wèn)題。
·Where?你將會(huì )把上載文件存儲到一個(gè)數據庫中。
·Why?在許多情況下,它確實(shí)是合適的解決方案。使用本文的解決方案,你不會(huì )因同步上載文件而煩惱,一旦你正在備份著(zhù)應用程序-你只需要備份數據庫就可以了。而且,你不需要與一個(gè)用戶(hù)及其在一文件系統上的文件一直保持十分笨拙的聯(lián)系。
·How?可以使用BLOB(二進(jìn)制大型對象)字段實(shí)現。這樣的字段用于存儲大型的并且經(jīng)常是原始或二進(jìn)制的格式。Hibernate可以使你非常容易地操作這些字段。
典型情況下,一個(gè)企業(yè)應用程序(EAR)由兩部分組成:Web層(WAR)和商業(yè)層(EJB)。商業(yè)層包含一個(gè)無(wú)狀態(tài)的會(huì )話(huà)bean-它借助于Hibernate的幫助實(shí)現數據的存儲。圖1顯示了EJB的遠程接口。
![]() 圖1.HelloSession EJB的接口。 |
![]() 圖2.所有的Web層的servlet都使用該User POJO。 |
4. 環(huán)境準備
如果所有相應的軟件被正確下載并安裝在你的PC上,那么下一步,你就可以準備數據庫和存取該數據庫的用戶(hù)而且還要使用名為MySqlDS的JNDI設置好連接池與數據源。同時(shí),請肯定MySQL Connector/J存在于你的類(lèi)路徑中!要檢查這一點(diǎn),只需輸入:
echo %CLASSPATH%
文件mysql-connector-java-3.1.7-bin.jar(帶有完整的路徑)應該于此。這是必需的,因為WebLogic需要查找到MySQL Connector/J并用該驅動(dòng)程序進(jìn)行工作。
現在,既然一切準備妥當,我們就可以在數據庫中創(chuàng )建一個(gè)表以用于保存用戶(hù)實(shí)體。以任何MySQL客戶(hù)身份登錄到該數據庫,然后輸入:
| drop table if exists TABLE_USER_FILE; create table TABLE_USER_FILE ( USER_ID int auto_increment not null, USER_USERNAME text, USER_FILENAME text, USER_FILETYPE text, USER_FILESIZE text, USER_FILEBIN longblob, primary key (USER_ID) ) type = MyISAM; |
| ... <form-beans> ?。糵orm-bean name="uploadFileForm" type="org.apache.struts.action.DynaActionForm" dynamic="true"> ?。糵orm-property name="myFile" type="org.apache.struts.upload.FormFile"/> ?。糵orm-property name="myName" type="java.lang.String"/> ?。?form-bean> </form-beans> ... <action-mappings> <action path="/UploadFile" type="com.prokhorenko.web.UploadFileAction" name="uploadFileForm"> ... |
| ... User per = new User(); DynaActionForm df = (DynaActionForm) form; FormFile myFile = (FormFile) df.get("myFile"); ... per.setFilebin ( Hibernate.createBlob (myFile.getInputStream()) ); ... |
| ... User per = bd.getUser( new Long((String)request.getParameter("id")) ); ... |
| ... ServletOutputStream outStream = response.getOutputStream(); InputStream in = per.getFilebin().getBinaryStream(); byte[] buffer = new byte[32768]; int n = 0; while ( ( n = in.read(buffer)) != -1) { outStream.write(buffer, 0, n); } in.close(); outStream.flush(); ... |
聯(lián)系客服