JSP处理form的提交,及文件的上传



JSP处理form的提交,及文件的上传。处理form提交的数据除了使用request.getParameter()和getParameterValues也可以使用el中的param
paramValues

request.getParameter不能处理上传的文件是因为上传数据采用的编码不一样,普通的使用的是application/x-www-
form-urlencoded
而上传文件使用的是multipart/form-data,当使用multipart/form-data编码的时候,使用
request.getParameter无法得到form中的元素的值,只能使用request.getInputStream()得到post的实体流。关于上传文件更详细规范参见http://www.ietf.org/rfc/rfc1867.txt。

解决jsp文件上传问题可以使用jspsmartupload组件,o’reilly的multipartRequest类工具
(http://www.servlets.com/cos/)
还有jakarta
apache的commonsfileupload。

使用multipartRequest的示例:
<%@page
import=”com.oreilly.servlet.MultipartRequest”
%>

<%
//比如上传文件如果是中文名,则使用带编码名的构造函数,这里用的utf-8
MultipartRequest
mreq = new MultipartRequest(request,”e:\\b\\”,”UTF-8″);
out.println(“txt is ”
+
mreq.getParameter(“txt”));
out.println(mreq.getFilesystemName(“file”));
out.println(request.getParameter(“txt”));//这个结果为null,request取不到值
%>
multipartRequest的默认上传文件大小为1M,但可以使用带有限制上传文件大小参数的构造函数,如果想不限制大小,则可以在构造
MultipartRequest前,使用request.getContentLength()先得到实体内容的大小,然后将其传入
MultipartRequest的构造函数。


JSPSmartUpload的用法示例:
<%
SmartUpload su =
new
SmartUpload();
//必须执行这个初始化方法
su.initialize(pageContext);
su.setMaxFileSize(1
* 1024 *
1024);
su.upload();//执行这个方法后才能保存文件
try
{
//设置允许的下载列表
su.setAllowedFilesList(“htm,html,txt,,”);
//设置是否拒绝用物理路径保存
su.setDenyPhysicalPath(false);
su.save(“e:\\b\\”);
//如果需要改文件名,就使用下面的方法
//su.getFiles().getFile(0).saveAs(“e:\\b\\test.doc”,SmartUpload.SAVE_PHYSICAL);
out.println(“the
upload ok:” + su.getRequest().getParameter(“txt”));

}
catch(Exception
e)
{
out.println(e.toString());
}
%>

使用jspsmartupload进行下载的用法示例:
//如果使用smartupload进行下载的话,必须执行此句,不然会把文件内容显示在浏览器中
//有了此句就会在打开此网页的时候弹出下载保存文件窗口
su.setContentDisposition(“inline”);
su.downloadFile(“c:\\source\\a.zip”,”application/x-zip-compressed”,”dest.zip”);

但是使用jspsmartupload保存有中文名的文件和用它取得form中的元素值不会出乱码,必须在文件上传网页中添加如下元素:
<meta
http-equiv=”Content-Type” content=”text/html;
charset=GB2312″>,如果把gb2312换成utf-8什么的就会出乱码。
个人觉得没有MultipartRequest好,因为smartupload好像没有可以设置编码的方法,所以只能处理gb2312,其他的就会出乱码。

如果使用textarea输入多行文本,在服务器端得到的文本中的换行为”\r\n”,如果想在网页中正确显示换行,使用字符串的
replaceAll(“\r\n”,”<br>”)方法就行了。