如何实现文件上传
开发Web程序通常需要文件上传功能,现在有很多免费的文件上传组件,其中使用比较多的也是非常著名的有:
FileUpload (http://jakarta.apache.org/site/downloads/downloads_commons-fileupload.cgi)
Cos (http://www.servlets.com/cos/index.html) 基于javabean组件
SmartUpload (http://wwww.jspsmart.com) 完全基于JSP来处理上传的组件
以下部分内容来自http://www.blogjava.net/caixuetao/articles/30841.html)
它们的性能比较如下:
2M
第1次
第2次
第3次
第4次
平均
Cos
297
203
234
245
245
FileUpload
281
312
281
312
297
SmartUpload
531
594
485
532
536
20M
第1次
第2次
第3次
第4次
平均
Cos
2562
2109
2719
2172
2391
FileUpload
4062
4140
5360
3922
4371
SmartUpload
3453
3094
3078
3547
3293
45M
第1次
第2次
第3次
第4次
平均
Cos
4860
4844
5125
5171
5000
FileUpload
9000
8391
10375
10078
9461
SmartUpload
8265
9187
8672
8856
8745
200M
第1次
第2次
第3次
第4次
平均
Cos
55813
52282
54796
51187
53520
FileUpload
76343
68531
80954
79031
76215
SmartUpload
内存堆栈溢出
从上述的表格对比中可以看出Cos始终保持着良好的性能。在上传量较小(容量<2M,这是最常出现的情况)时,Cos比FileUpload性能并没有好很多,但SmartUpload就已经开始显出弱势。
随着容量的增大,FileUpload和SmartUpload的性能下降非常快,直到200M容量时,SmartUpload已经不堪重负崩溃了,而Cos此时的花费时间比FileUpload少了20多秒,不能不说在本次的评测中,Cos的性能位居第一。
通过对三种流行的上传组件进行对比,我认为选用Cos是比较好的。在实际的项目中,可以把上传的文件放到文件夹,文件路径存于数据库中以便于管理。
如果需要把文件上传到数据库也很简单,从Cos中已经得到了上传文件(java.io.File),其后的操作很平常所做的一样: 通过File得到inputStream,存到数据库的blob或Clob字段即可。
对于使用Struts的项目,我觉得还是使用FileUpload比较好,因为Struts天生集成了FileUpload的功能,使用FileUpload会带来很多的便利。而如果想要开发独立的上传组件,则用Cos是最好的选择,可以在Cos的基础上封装一层,暴露给业务程序员的只是一些简单易用的API,而且可以给这些API加上自定义的javaDoc,这对于实际的开发和将来的扩展都是非常方便的。
以下使用cos组件简单的实现文件上传功能:
1. 将下载的cos.jar文件所在目录加入到环境变量classpath中<o:p></o:p>
html 代码
- <!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN
- http://www.w3.org/TR/html4/loose.dtd>
- <html>
- <head>
- <meta http-equiv=Content-Type content=text/html; charset=gb2312>
- <title>实现文件上传的一个例子程序</title>
- </head>
- <body>
- <div align="center">
- <!-- enctype参数很重要,当向服务器传送如片或文件这样包含非ASCII字符或二进制数的数据时,跟据RFC1867规定必须使用"mutiplepart/form-data"内容类型-->
- </div>
- <form name=form1 method=post enctype=multipart/form-data action=upload.jsp>
- <div align="center">
- <table width="255" border="1" >
- <tr>
- <td><input name=file12 type=file></td>
- </tr>
- <tr>
- <td><input name=file2 type=file></td>
- </tr>
- <tr>
- <td><input name=file3 type=file></td>
- </tr>
- <tr>
- <td align="center"><input type=submit name=Submit value=提交></td>
- </tr>
- </table>
- </div>
- </form >
- </body>
- </html>
3. 实现上传文件功能可以写一个Servlet, 这里简单起见,写成一个upload.jsp文件:
jsp 代码
- <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
- <title>实现文件上传功能 </title>
- </head><%@page import="com.oreilly.servlet.MultipartRequest" %>
- <%@page contentType="text/html; charset=gb2312" %>
- <%
- //文件上传后,保存在"f:/uploadfiles"
- String saveDirectory = "f:/uploadfiles";
- //每个文件最大5m,最多3个文件,所以...
- int maxPostSize = 3 * 5 * 1024 * 1024 ;
- //response的编码为gb2312,同时采用缺省的文件名冲突解决策略,实现上传
- MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize, "gb2312");
- %>
4. 将以上两个文件放到tomcat安装目录\webapps目录下的一个文件夹如uploadExample下即可<o:p></o:p>
附:(http://blog.youkuaiyun.com/hdhero/archive/2005/03/22/326405.aspx)
一.SmartUpload组件例子代码:<o:p></o:p>
- <%@ page contentType="text/html;charset=gb2312"%>
- <%@ page import="java.sql.*"%>
- <%@ page import="com.jspsmart.upload.*" %>
- <%
- //实例化上载bean
- SmartUpload mySmartUpload=new SmartUpload();
- //初始化
- mySmartUpload.initialize(pageContext);
- //设置上载的最大值,注意:如果这里设置过大会出现问题!
- mySmartUpload.setMaxFileSize(500 * 1024*1024);
- //上载文件
- mySmartUpload.upload();
- //循环取得所有上载的文件
- for (int i=0;i<mySmartUpload.getFiles().getCount();i++){
- //取得上载的文件
- com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);
- if (!myFile.isMissing())
- {
- //取得上载的文件的文件名
- String myFileName=myFile.getFileName();
- //取得不带后缀的文件名
- String suffix=myFileName.substring(0,myFileName.lastIndexOf('.'));
- //取得后缀名
- String ext= mySmartUpload.getFiles().getFile(0).getFileExt();
- //取得文件的大小
- int fileSize=myFile.getSize();
- //保存路径
- String aa=getServletContext().getRealPath("/")+"jsp\\";
- String trace=aa+myFileName;
- //取得别的参数
- String explain=(String)mySmartUpload.getRequest().getParameter("text");
- String send=(String)mySmartUpload.getRequest().getParameter("send");
- //将文件保存在服务器端
- myFile.saveAs(trace,mySmartUpload.SAVE_PHYSICAL);
- %>
注意使用smartupload上传过大文件,或者多文件的时候可能出现CPU或内存占用过高的问题.只有重新启动容器才能恢复正常! <o:p> </o:p>
二.commons-fileupload组件<o:p></o:p>
- <%@ page language=“java”contentType=“text/html;charset=GBK”%>
- <%@ page import=“java.util.*”%>
- <%@ page import=“org.apache.commons.fileupload.*”%>
- <html>
- <head>
- <title>文件上传</title>
- </head> &nbs