我思故我强

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 李云泽 阅读(422) 评论(0)  编辑  收藏 所属分类: J2EE


只有注册用户登录后才能发表评论。


网站导航: