使用SmartUpload组件实现文件上传
- 格式:docx
- 大小:114.02 KB
- 文档页数:5
彻底解决jsp中用SmartUpload上传附件中文乱码问题最近开发一个基于J2EE平台的DRP项目,其中需要上传下载大量的附件。
项目中所使用的数据库为Oracle8I,操作系统和Web应用服务程序为:①开发环境Win2000/Tomcat、②开发测试环境Win2000/WebSphere6.0,③正式环境Unix/WebSphere6.0,④正式环境的备用服务器Linux/WebSphere6.0。
在开发上传附件中出现了一个很普通很麻烦的问题,就是中文名称乱码问题,根据网上查询的资料,很快解决了①②③环境下的乱码,但④环境下依然是乱码。
最后,经过持续一个多月的研究实验,终于找到一种同时满足①②③④种环境的解决办法。
基本原理是:(1)、在上传之前,先对要上传的文件名进行编码;(2)、对编码后的文件名解码后,再插入数据库中。
基本实现如下面的代码片段,上传代码:......<input type="file" name="upFile" size="40" maxlength="100"><input type="button" name="btUpload" value="上传附件"onClick="doFileUpLoad();"><input type="hidden" name="table_name1" value="">......<script>function doFileUpLoad(){.....//使用javascript的函数escape编码后放到域table_name1中form1.table_name1.value = escape(form1.upFile.value);form1.submit();......}</script>JSP代码:......//获取上传的文件名,并用自编的unescape函数解码table_name1 =CUtil.unescape(mySmartUpLoad.getRequest().getParameter("table_name1"). toString());//分离目录信息,在数据库中只存储文件名table_name1 = CUtil.extractFileName(table_name1);......unescpe函数代码:public static String unescape(String src) {StringBuffer tmp = new StringBuffer();tmp.ensureCapacity(src.length());int lastPos = 0, pos = 0, nLen = src.length();char ch;while (lastPos < nLen) {pos = src.indexOf("%", lastPos);if (pos == lastPos) {if (src.charAt(pos + 1) == 'u') {ch = (char) Integer.parseInt(src.substring(pos + 2, pos + 6), 16);tmp.append(ch);lastPos = pos + 6;} else {ch = (char) Integer.parseInt(src.substring(pos + 1, pos + 3), 16);tmp.append(ch);lastPos = pos + 3;}} else {if (pos == -1) {tmp.append(src.substring(lastPos));lastPos = nLen;} else {tmp.append(src.substring(lastPos, pos));lastPos = pos;}}}return tmp.toString();}下载处理代码:......String FileName = rs.getString("NEWFILE_NAME"); //附件存储在服务器上的文件名String oFileName = rs.getString("OLDFILE_NAME"); //附件原来的文件名//以下代码的作用是,在浏览器中下载附件时,提示的中文名称不为乱码oFileName = new String(oFileName.getBytes("gb2312"),"iso8859-1"); mySmartUpLoad.downloadFile(FileName,null,oFileName);......提示:本系统使用SmartUpload组件上传/下载附件。
----作者:张小龙email:zxlxgd@SmartUpload的作用1.SmartUpload的主要作用:主要是完成上传操作,如果想要上传的话,可以直接使用html表单中的file 元素即可。
<form><input type="file" name="file"></form>常见的上传组件:Smartupload, Apache FileUpload2.使用Smartupload上传文件编写一个表单,表单中使用file元素。
<html><head><title>SmartUpload</title></head><body><form action="SmartUpload01.jsp"method="post"enctype="multipart/form-data">用户姓名:<input type="text"name="uname"><br>上传的图片:<input type="file"name="pic"><input type="submit"value="上传"></form></body></html>之后编写jsp文件,接收上传的内容,上传的步骤分为以下几个步骤:1.初始化上下文2.准备上传3.保存文件范例:Smartupload01.jsp:<%@page language="java"import="java.util.*"pageEncoding="gbk"%> <jsp:useBean id="smartupload"class="org.lxh.smart.SmartUpload"/><html><head><title>SmartUpload</title></head><body><%request.setCharacterEncoding("gbk");smartupload.initialize(pageContext);//初始化上传smartupload.upload();//准备上传String name=smartupload.getRequest().getParameter("uname");smartupload.save("upload");//保存文件%><h2><%=name %></h2></body></html>注意:上传文件的时候表单需要封装。
一、安装篇jspSmartUpload是由网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中。
该组件有以下几个特点:1、使用简单。
在JSP文件中仅仅书写三五行JAVA代码就可以搞定文件的上传或下载,方便。
2、能全程控制上传。
利用jspSmartUpload组件提供的对象及其操作方法,可以获得全部上传文件的信息(包括文件名,大小,类型,扩展名,文件数据等),方便存取。
3、能对上传的文件在大小、类型等方面做出限制。
如此可以滤掉不符合要求的文件。
4、下载灵活。
仅写两行代码,就能把Web服务器变成文件服务器。
不管文件在Web服务器的目录下或在其它任何目录下,都可以利用jspSmartUpload进行下载。
5、能将文件上传到数据库中,也能将数据库中的数据下载下来。
这种功能针对的是MYSQL 数据库,因为不具有通用性,所以本文不准备举例介绍这种用法。
jspSmartUpload组件可以从网站上自由下载,压缩包的名字是jspSmartUpload.zip。
下载后,用WinZip或WinRAR将其解压到Tomcat的webapps目录下(本文以Tomcat服务器为例进行介绍)。
解压后,将webapps/jspsmartupload目录下的子目录Web-inf名字改为全大写的WEB-INF,这样一改jspSmartUpload类才能使用。
因为Tomcat对文件名大小写敏感,它要求Web应用程序相关的类所在目录为WEB-INF,且必须是大写。
接着重新启动Tomcat,这样就可以在JSP文件中使用jspSmartUpload组件了。
注意,按上述方法安装后,只有webapps/jspsmartupload目录下的程序可以使用jspSmartUpload组件,如果想让Tomcat服务器的所有Web应用程序都能用它,必须做如下工作:1.进入命令行状态,将目录切换到Tomcat的webapps/jspsmartupload/WEB-INF目录下。
127 if(!uyzm.equalsIgnoreCase(yzm))response.sendRedirect("loginerr.jsp?err="+new String("验证码错误".getBytes("gb2312"),"iso-8859-1"));elseout.println("验证成功!");%>这里分别从request 对象中取出输入的验证码值,从session 中取出保存的前面的Servlet 生成的验证码值,然后进行对比。
对比时为了忽略大小写,这里用了equalsIgnoreCase()方法。
如果验证码有错误,页面将跳转到loginerr.jsp 页面,同时传过去一个参数err ,表明出错信息。
由于这个信息是中文,所以为了防止出现乱码,这里进行了转码。
运行结果如图7.27所示。
图7.27 带有验证码的登录界面7.6.2 实战—JSPSmartUpload 实现文件上传下载JSPSmartUpload 是 网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP 文件中。
该组件有以下几个特点:∙ 使用简单,少量代码。
∙ 能全程控制上传,可获得全部上传文件的信息(包括文件名、大小、类型、扩展名、文件数据等),方便存取。
∙ 能对上传文件在大小、类型等方面做出限制和过滤。
∙ 下载灵活。
∙ 能将文件上传到数据库中,也能将数据库中的数据下载下来。
JSPSmartUpload 组件可以从 网站上下载,压缩包的名字是jspsmart.jar 。
下载后导入到工程后就可以使用。
另外,它还有许多其他功能设置使用非常方便,例如:∙ 设定上传限制,限制每个上传文件的最大长度。
su.setMaxFileSize(10000);∙ 限制总上传数据的长度。
su.setTotalMaxFileSize(20000);∙ 设定允许上传的文件(通过扩展名限制),仅允许DOC 、TXT 文件。
SmartUploadServlet.javaimport java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;import com.jspsmart.upload.*;;public class SmartUploadServlet extends HttpServlet {private ServletConfig config;//初始化Servletfinal public void init(ServletConfig config)throws ServletException{this.config=config;}//处理GET请求public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}//响应POST请求public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取PrintWriter对象PrintWriter out = response.getWriter();out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01Transitional//EN\">");out.println("<HTML>");out.println("<HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println("<BODY bgcolor='white'><center><br>");out.println("<br><h1>jspSmartUpload</h1>");out.println("<hr><br>");//新建一个SmartUpload对象SmartUpload mySmartUpload=new SmartUpload();try{//上传初始化mySmartUpload.initialize(config, request, response);//设定每个上传文件的最大长度mySmartUpload.setMaxFileSize(1*512*1024);//设定总上传数据的长度mySmartUpload.setTotalMaxFileSize(1*1024*1024);//设定允许上传的文件的类型,只允许上传java,doc,txt文件mySmartUpload.setAllowedFilesList("java,doc,txt");//设定禁止上传的文件的类型,禁止上传带有exe,bat文件mySmartUpload.setDeniedFilesList("exe,bat");//上传文件mySmartUpload.upload();//将上传文件全部保存到指定目录int count=mySmartUpload.save("/");out.println(//利用Request对象获取参数之值mySmartUpload.getRequest().getParameter("paramete")+" ");//显示处理结果out.println("<font color=red>"+count+"</font> File Upload!<br>");//处理每个上传文件for(int i=0;i<mySmartUpload.getFiles().getCount();i++){com.jspsmart.upload.File file=mySmartUpload.getFiles().getFile(i);//判断用户是否选择了文件if(!file.isMissing()){//打印文件名out.println("File Name: <font color=red>"+file.getFileName()+"</font><br>");//打印文件扩展名out.println("File ExtName: <font color=red>"+file.getFileExt()+"</font><br>");//打印文件路径,包括目录out.println("Path: <font color=red>"+file.getFilePathName()+"</font><br>");//另存到以Web应用程序的根目录为文件根目录的目录下//(声明一下:在Myeclipse中,该目录位于工程下的.metadata/.me_tcat/webapps/该工程目录/upload/)file.saveAs("/upload/"+file.getFileName(),mySmartUpload.SAVE_VIRTUAL);//另存到操作系统的根目录为文件根目录的目录下file.saveAs("F:\\mytool\\project\\SmartUpload\\temp\\"+file.getFileName(),mySmartUpload.SAVE_PHYSICAL);}}}catch(Exception e){//异常处理//打印自定义异常信息out.println("Unanable to upload the file.<br>");out.println("Please Check The File Type");}out.println("</center></BODY>");out.println("</HTML>");}}upload.jsp<%@ page contentType="text/html;charset=gb2312"%><html><head><title>jspSmartUpload组件文件上传</title></head><body><br><br><center><font size="5" color="#ff0000"><b>jspSmartUpload组件文件上传</b></font><br> <form name="uploadForm" enctype="multipart/form-data"method="post" action="servlet/SmartUploadServlet"><table border="0" align="center" cellpadding="2" cellspacing="2"bgcolor="snow"><input type="hidden" name="paramete" value="OK!"><tr><td><div align="center">上传文件1:</div></td><td><div align="center"><input type="file" name="file1" size="25" maxlength="80"> </div></td></tr><tr><td><div align="center">上传文件2:</div></td><td><div align="center"><input type="file" name="file2" size="25" maxlength="80"> </div></td></tr><tr width="100%"><td><div align="center"><input type="submit" value="上传文件"><input type="reset" value="清除"></div></td></tr></table></form></center></body></html>SmartDownloadServlet.javaimport java.io.*;import java.util.*;import javax.servlet.*;import javax.servlet.http.*;import com.jspsmart.upload.*;;public class SmartDownloadServlet extends HttpServlet {private ServletConfig config;//初始化Servletfinal public void init(ServletConfig config)throws ServletException{this.config=config;}//处理GET请求public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}//响应POST请求public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//获取PrintWriter对象//PrintWriter out = response.getWriter(); //这里会出现异常 out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");out.println("<HTML>");out.println("<HEAD><TITLE>A Servlet</TITLE></HEAD>");out.println("<BODY bgcolor='white'><center><br>");out.println("<br><h1>jspSmartDownload</h1>");out.println("<hr><br>");//新建一个SmartUpload对象SmartUpload mySmartUpload=new SmartUpload();try{//上传初始化mySmartUpload.initialize(config, request, response);String fileName=request.getParameter("fileName");//设定contentDisposition为null以禁止浏览器//自动打开文件//保证单击链接后是下载文件,若不设定,则mySmartUpload.setContentDisposition(null);//下载文件mySmartUpload.downloadFile("/upload/"+fileName);}catch(Exception e){//异常处理//打印自定义异常信息//out.println("Download Fail.<br>");//out.println(e.toString());//想要打印信息可参考下面的补充说明}//out.println("</center></BODY>");//out.println("</HTML>");}}download.jsp<%@ page contentType="text/html;charset=gb2312"%><html><head><title>jspSmartUpload组件下载文件</title></head><body><br><br><center><font size="5" color="#ff0000"><b>jspSmartUpload组件下载文件</b></font><br> <form name="uploadForm" enctype="multipart/form-data"method="post" action="servlet/SmartDownloadServlet"><table border="0" align="center" cellpadding="2" cellspacing="2"bgcolor="snow"><tr><td><div align="center"><a href="servlet/SmartDownloadServlet?fileName=1.jpg">文件1</a></div></td><td><div align="center"><a href="servlet/SmartDownloadServlet?fileName=2.jpg">文件2</a></div></td></tr></table></form></center></body></html>。
使用SmartUpload组件实现文件上传
文件上传是做JavaWeb项目中经常使用的功能,而SmartUpload是一个可免费使用的全功能的文件上传下载组件。
虽然此组件最近很少有更新,但由于其简单易用,对于一般的项目来说还是一个很好的选择。
下面以一个具体的例子来说明此组件的使用。
首先,将SmartUplaod的jar文件放入项目的lib目录中。
然后,我们开发上传用的JSP页面,为了简单起见,本表单中仅包含了用户上传文件的文件域和一个上传按钮。
效果如下:
需要注意的是,表单中使用了文件域,则表单提交类型(method)必须为post而且添加enctype="multipart/form-data"。
有了上传页面,下面编写处理上传的Servlet,代码如下:
以上代码实现了单文件上传处理,添加了注释方便阅读。
其中核心就是使用了SmartFile 类,这个类的主要方法如下:
1、saveAs作用:将文件换名另存。
原型:
public void saveAs(ng.StringdestFilePathName)
或
public void saveAs(ng.StringdestFilePathName, intoptionSaveAs)
其中,destFilePathName是另存的文件名,optionSaveAs是另存的选项,该选项有三个值,分别是SAVEAS_PHYSICAL,SAVEAS_VIRTUAL,SAVEAS_AUTO。
SAVEAS_PHYSICAL表明以操作系统的根目录为文件根目录另存文件,SAVEAS_VIRTUAL表明以Web应用程序的根目录为
文件根目录另存文件,SAVEAS_AUTO则表示让组件决定,当Web应用程序的根目录存在另存文件的目录时,它会选择SAVEAS_VIRTUAL,否则会选择SAVEAS_PHYSICAL。
2、isMissing
作用:这个方法用于判断用户是否选择了文件,也即对应的表单项是否有值。
选择了文件时,它返回false。
未选文件时,它返回true。
原型:publicbooleanisMissing()
3、getFieldName
作用:取HTML表单中对应于此上传文件的表单项的名字。
原型:public String getFieldName()
4、getFileName
作用:取文件名(不含目录信息)
原型:public String getFileName()
5、getFilePathName
作用:取文件全名(带目录)
原型:public String getFilePathName
6、getFileExt
作用:取文件扩展名(后缀)
原型:public String getFileExt()
7、getSize
作用:取文件长度(以字节计)
原型:publicintgetSize()
8、getBinaryData
作用:取文件数据中指定位移处的一个字节,用于检测文件等处理。
原型:public byte getBinaryData(int index)。
其中,index表示位移,其值在0到getSize()-1之间。
上传效果如下:
当然,此例只实现了单文件的处理,如果需要多文件上传只需要在表单中提供多个文件域,并在servlet中循环处理即可。
本文中提到的jspSmartupload组件可以在网上进行下载,资源比较多此处不再提供下载地址。
作者:中软卓越天津ETC。