我思故我強

          JSP中實現文件上載

          一、前言
          文件上載對于任何web應用程序都是一個很有用處的功能。比如,在基于web的email中使用文件上載在消息中加入附件;在技術支持站點可以使用文件上載接收從用戶處發來的錯誤日志和缺陷報告文檔;在web應用中使用文件上載,通過友好的web界面在用戶間共享文件。本文將對如何在JSP編程中上載文件進行討論,并給出解決方法。
          二、文件上載的方式
          在TCP/IP中最早出現的文件上載機制是FTP,它是將文件由客戶端發送到服務器的標準機制。它很可靠,能夠考慮到跨平臺的文本和二進制格式文件。但在JSP編程中不能使用FTP方法來上載文件,這是由JSP的運行機制所決定的。我們知道:JSP(JavaServer Pages)是由Sun MicroSystems公司倡導、許多公司參與,一起建立的一種動態網頁技術標準。它在傳統的網頁HTML文件中加入JAVA程序片段和JSP標記就構成了JSP網頁。web服務器在遇到訪問JSP網頁請求時,首先執行其中的程序片段,然后將執行結果以HTML形式返回客戶。這種運行機制就要求客戶與服務器的聯系需要使用HTTP協議而不能是FTP協議。
          在HTTP協議中上載文件主要有兩種機制:
          1)RFC1867方式:RFC1867在作為標準發布之前首先被Netscape的Navigator 2.0中采用。隨后被Microsoft的IE3.0的附件和IE3.03的一部分使用。它是一種簡單實用的方法。只在表單字段中定義一個file類型的input:
          <input type="file">
          并且在表單本身中加入了不同的編碼方案,它不再使用典型的:
          <form action="test.jsp" method="post">
          而是使用
          <form action="test.jsp" method="post" enctype="multipart/form-data">
          這種編碼方案在傳送大量數據時比缺省的"application/x-url-encoded"表單編碼方案要效率高得多。因為URL編碼只有很有限的字符集。當使用任何超出字符集的字符時,必須用"%nn"代替(這里的nn表示相應的兩個十進制數)。這樣即使是普通的空格字符也要用"%20"代替。那么,通過URL編碼方式上載的文件將會是原來的2-3倍大。而使用RFC1867編碼方式則只是在傳送數據的周圍加上很簡單的頭部來標識文件內容。
          2)put方式:在HTTP1.1中引入了一個新的HTTP動詞:put。當web服務器收到一個HTTP的put請求和對象名字(如:"/myweb/images/x.gif")時,它會驗證用戶,接收HTTP流的內容,并把它直接存入web服務器。由于這種方式可能會對一個web站點造成破壞,因而并不常用。而且它也失去了web服務器端的最大優勢:服務器的可編程性。在使用put方式時,服務器自己處理客戶的請求,沒有空間讓JSP介入,因此,此方式對于JSP應用開發都是毫無用處的。
          三、JSP中實現文件上載的方法
          從以上分析中我們可以得出結論:RFC1867是在JSP編寫的web應用程序中實現文件上載的最好方法。它是如何在實際應用的呢?
          這里將介紹一種簡單而實用的方法,只需要幾行代碼就可以在JSP程序中實現文件上載。這就是使用一個免費的JAVA組件JspSmartUpload(http://www.jspsmart.com)實現文件上載。
          1) JspSmartUpload的配置要求
          安裝JspSmartUpload組件需要如下的配置:
          a. web服務器(如IIS,apache等)
          b. JDK1.1.2以上的JAVA編譯器
          c. 支持JSP1.1及JavaServelet API 2.2的引擎。
          其中的JSP引擎有許多產品,如:
          Tomcat: http://java.sun.com/products/jsp/tomcat
          Allaire Jrun: http://www.allaire.com/products/jrun
          JSWDK: http://java.sun.com/produces/jsp/
          IBM webSphere: http://www-4.ibm.com/software/webservers/
          Resin: http://www.caucho.com
          注意:本文將主要討論JspSmartUpload在Tomcat引擎中的安裝及使用。
          2) JspSmartUpload的安裝
          首先, 把下載的壓縮文件JspSmartUpload.zip解壓縮到/tomcat/webapps/ 目錄下(/tomcat目錄是你的tomcat引擎安裝的根目錄),這樣就會形成如下的目錄結構/tomcat/webapps/jspsmartupload/。所有必需的文件都在這個目錄下。
          其次,把如下內容粘貼到/tomcat/conf/server.xml文件中。
          <Context path="/jspsmartupload" docBase="/tomcat/webapps/jspsmartupload"
          defaultSessionTimeOut="30" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false" />
          最后,把如下的內容粘貼到/tomcat/conf/uniworkermap.properties文件中。
          /jspsmartupload/*.jsp=ajp12
          /jspsmartupload/servlet/*=ajp12
          至此,jspsmartupload在tomcat引擎中的安裝就完成了。
          3) 上載文件的HTML表單
          如前所述,在JSP中文件上載使用的是RFC1867標準。在其中也規定了上載文件所使用的HTML表單的格式。此表單的格式被Netscape 3和Microsoft IE3.02以上的瀏覽器所支持。上載文件的表單發布具備如下的格式:
          a) 單所使用的方法必須是post
          b) 在action屬性中的執行程序必須能處理由客戶端返回的數據
          c) 表單必須使用MIME類型:multipart/form-data
          d) 表單必須至少包含一個<input type=”file”>元素。與RFC1867兼容的瀏覽器將會在客戶端界面上顯示一個文本框和一個“游覽”按鈕,以方便客戶端選擇上載的文件。
          下面是使用此類型表單的HTML文件例子。
          upload.htm
          <HTML>
          <BODY BGCOLOR="white">
          <H1>jspUpload : Sample </H1>
          <HR>
          <form METHOD="POST" ACTION="/jspsmartupload/upload.jsp" NAME="PW" ENCTYPE="multipart/form-data">
          <table CELLSPACING="0" CELLPADDING="3" BORDER="1" WIDTH="474">
          <!-- FILE -->
          <tr>
          <td><small><font face="Verdana">
          Select a first file :
          </font></small></td>
          <td><small><font face="Verdana">
          <input TYPE="file" name="FILE1"></font></small></td>
          </tr>
          <tr>
          <td><small><font face="Verdana">Select a second file :?? </font></small></td>
          <td><small><font face="Verdana">
          <input TYPE="file" name="FILE2"></font></small></td>
          </tr>
          <!-- TEXT -->
          <tr>
          <td width="150"><div align="left"><p><small><font face="Verdana">Text :?? </font></small></td>
          <td width="324"><small><font face="Verdana"><input TYPE="TEXT" name="myText" value=""><br></font></small></td>
          </tr>
          <!-- SUBMIT -->
          <tr>
          <td colspan="2" width="474"><div align="center"><center><p><small><font face="Verdana"><input
          TYPE="Submit"> </font></small></td>
          </tr>
          </table>
          </form>
          </BODY>
          </HTML>
          4) 使用JspSmartUpload處理表單
          當客戶端submit表單以后,服務器將會調用表單action中的JSP程序處理客戶端的請求。在此JSP中就要調用JspSmartUpload來完成文件上載的請求。
          在JSP程序中,首先要在<%@ page import=my.class %>中聲明引入JspSmartUpload類。然后使用JavaBean來實例化一個JspSmartUpload類。如:<jsp:useBean id=”mybean” class=”my.class”>。在實例化后,要使用JSP引擎隱含的對象pageContext對JspSmartUpload JavaBean進行初使化,這樣就把客戶端的請求傳給了JspSmartUpload組件。然后使用組件的upload()方法對客戶的請求進行分析,最后把這些數據通過save()方法存入一個文件。
          下面是處理上一個HTML表單的JSP例程。
          upload.jsp
          <%@page language="java" import="com.jspsmart.upload.*"%>
          <jsp:useBean id="myUpload" scope="page" class="com.jspsmart.upload.SmartUpload" />
          <HTML>
          <BODY BGCOLOR="white">
          <H1>jspUpload : Sample</H1>
          <HR>
          <%
          // 初使化
          myUpload.initialize(pageContext);
          // 分析客戶數據
          myUpload.upload();
          //
          // 處理上載文件
          //
          out.println("<BR><STRONG>關于文件的信息</STRONG><BR>");
          out.println("上載文件的數量 = " + myUpload.getFiles().getCount() + "<BR>");
          //out.println("文件大小 (bytes) = " + myUpload.getFiles().getSize() +"<BR>");
          for (int i=0;i<myUpload.getFiles().getCount();i++){
          out.print(myUpload.getFiles().getFile(i).getFieldName());
          if (!myUpload.getFiles().getFile(i).isMissing())
          out.print(" = " + myUpload.getFiles().getFile(i).getFileName() + " (" + myUpload.getFiles().getFile(i).getSize() + ")");
          else
          out.print(" = 空");
          out.println("<BR>");
          }
          //
          // 處理客戶請求信息
          //
          out.println("<BR><BR><STRONG>顯示客戶表單數據</STRONG><BR>");
          // 顯示請求名
          java.util.Enumeration e = myUpload.getRequest().getParameterNames();
          // 得到請求的值
          while (e.hasMoreElements()) {
          String key = (String)e.nextElement();
          String[] values = myUpload.getRequest().getParameterValues(key);
          // 顯示請求的值
          for(int i = 0; i < values.length; i++) {
          out.print(key + " = ");
          out.print(values[i] + "<BR>");
          }
          }
          %>
          </BODY></HTML>
          5) 運行例程
          把上述的HTML表單例子及處理表單的JSP例程存到/tomcat/webapps/uspsmartupload/目錄下,然后運行/tomcat/bin/startup.bat啟動服務器。在IE或Netscape的地址欄中輸入:
          http://localhost:8080/jspsmartupload/jspupload.htm
          就可以看到運行結果了。
          四、結論
          JspSmartUpload組件不僅可以把客戶端的數據存入到文件中,也可以把它存入到數據庫中。而且,它的安裝及使用方法簡單易學,是一個非常好的上傳組件,可以給JSP編制的web應用程序提供更強大的功能。

          posted on 2007-11-02 10:44 李云澤 閱讀(433) 評論(0)  編輯  收藏 所屬分類: J2EE

          主站蜘蛛池模板: 乐都县| 邹平县| 西峡县| 斗六市| 商都县| 上思县| 康平县| 峨眉山市| 昌图县| 清水县| 城固县| 讷河市| 石家庄市| 都兰县| 广平县| 义马市| 新津县| 达州市| 五家渠市| 涞水县| 资阳市| 孟津县| 上饶县| 诸城市| 巴彦淖尔市| 芜湖县| 赤壁市| 温州市| 牡丹江市| 南和县| 黔南| 铜梁县| 福鼎市| 谢通门县| 偃师市| 通海县| 稷山县| 铜梁县| 米易县| 宾川县| 花莲市|