论坛首页 Java企业应用论坛

如何实现文件上传

浏览 6553 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2007-03-07  

    如何实现文件上传

       开发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 代码
  1. <!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN   
  2. http://www.w3.org/TR/html4/loose.dtd>   
  3. <html>   
  4. <head>   
  5. <meta http-equiv=Content-Type content=text/html; charset=gb2312>   
  6. <title>实现文件上传的一个例子程序</title>   
  7. </head>   
  8. <body>   
  9. <div align="center">   
  10. <!-- enctype参数很重要,当向服务器传送如片或文件这样包含非ASCII字符或二进制数的数据时,跟据RFC1867规定必须使用"mutiplepart/form-data"内容类型-->   
  11. </div>   
  12. <form name=form1  method=post enctype=multipart/form-data action=upload.jsp>   
  13. <div align="center">   
  14. <table width="255" border="1" >   
  15. <tr>   
  16. <td><input name=file12 type=file></td>   
  17. </tr>   
  18. <tr>   
  19. <td><input name=file2 type=file></td>   
  20. </tr>   
  21. <tr>   
  22. <td><input name=file3 type=file></td>   
  23. </tr>   
  24. <tr>   
  25. <td align="center"><input type=submit name=Submit value=提交></td>   
  26. </tr>   
  27. </table>   
  28. </div>   
  29. </form >   
  30. </body>   
  31. </html>   

3.         实现上传文件功能可以写一个Servlet, 这里简单起见,写成一个upload.jsp文件:

jsp 代码
  1. <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>   
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">   
  3. <html xmlns="http://www.w3.org/1999/xhtml">   
  4. <head>   
  5. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />   
  6. <title>实现文件上传功能 </title>   
  7. </head><%@page import="com.oreilly.servlet.MultipartRequest" %>    
  8. <%@page contentType="text/html; charset=gb2312" %>   
  9. <%    
  10. //文件上传后,保存在"f:/uploadfiles"    
  11. String saveDirectory = "f:/uploadfiles";    
  12. //每个文件最大5m,最多3个文件,所以...    
  13. int maxPostSize = 3 * 5 * 1024 * 1024 ;    
  14. //response的编码为gb2312,同时采用缺省的文件名冲突解决策略,实现上传    
  15. MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize, "gb2312");    
  16. %>   

4. 将以上两个文件放到tomcat安装目录\webapps目录下的一个文件夹如uploadExample下即可<o:p></o:p>

http://blog.csdn.net/hdhero/archive/2005/03/22/326405.aspx

一.SmartUpload组件例子代码:<o:p></o:p>

  1. <%@ page contentType="text/html;charset=gb2312"%>   
  2. <%@ page import="java.sql.*"%>   
  3. <%@ page import="com.jspsmart.upload.*" %>   
  4. <%   
  5.    //实例化上载bean   
  6.     SmartUpload mySmartUpload=new SmartUpload();   
  7.     //初始化   
  8.     mySmartUpload.initialize(pageContext);    
  9.     //设置上载的最大值,注意:如果这里设置过大会出现问题!   
  10.     mySmartUpload.setMaxFileSize(500 * 1024*1024);   
  11.     //上载文件   
  12.     mySmartUpload.upload();   
  13.    //循环取得所有上载的文件   
  14.    for (int i=0;i<mySmartUpload.getFiles().getCount();i++){   
  15.    //取得上载的文件   
  16.    com.jspsmart.upload.File myFile = mySmartUpload.getFiles().getFile(i);   
  17.    if (!myFile.isMissing())   
  18.     {   
  19.    //取得上载的文件的文件名   
  20.     String myFileName=myFile.getFileName();   
  21.     //取得不带后缀的文件名   
  22.     String  suffix=myFileName.substring(0,myFileName.lastIndexOf('.'));   
  23.     //取得后缀名   
  24.     String  ext= mySmartUpload.getFiles().getFile(0).getFileExt();     
  25.     //取得文件的大小     
  26.     int fileSize=myFile.getSize();   
  27.     //保存路径   
  28.     String aa=getServletContext().getRealPath("/")+"jsp\\";  
  29.     String trace=aa+myFileName;  
  30.     //取得别的参数  
  31.     String explain=(String)mySmartUpload.getRequest().getParameter("text");  
  32.     String send=(String)mySmartUpload.getRequest().getParameter("send");   
  33.     //将文件保存在服务器端    
  34.     myFile.saveAs(trace,mySmartUpload.SAVE_PHYSICAL);   
  35.     %>   

 注意使用smartupload上传过大文件,或者多文件的时候可能出现CPU或内存占用过高的问题.只有重新启动容器才能恢复正常<o:p>  </o:p>

二.commons-fileupload组件<o:p></o:p>

  1. <%@ page language=“java”contentType=“text/html;charset=GBK”%>   
  2. <%@ page import=“java.util.*”%>   
  3. <%@ page import=“org.apache.commons.fileupload.*”%>   
  4. <html>   
  5. <head>   
  6. <title>文件上传</title>   
  7. </head>  &nbs
   发表时间:2007-03-07  
呵呵  总结的很仔细啊 支持一下.我用SmartUpload做上传的时候确实觉得不好用于大数据量的传输.
0 请登录后投票
   发表时间:2007-03-07  
那堆框是怎么回事
0 请登录后投票
   发表时间:2007-03-07  
我觉得总结的有一些疑问。
上传文件不仅是耗时问题,还有一个耗内存的问题,这一点在大文件处理时很重要。
似乎没有考虑,如果考虑这一点,可能那个处理时间也有变化了。
0 请登录后投票
   发表时间:2007-03-07  
这个测试结果是不是有点误导人,不同的服务器应该是不一样的,这个测试是在什么服务器上做的? 服务器的最大内存设置是多少?这些最起码应该给出来,这样才全面一点
0 请登录后投票
   发表时间:2007-03-26  
首先还是表示感谢,顶一下,Cos 以前没听说过,这下又多了个选择
0 请登录后投票
   发表时间:2007-03-27  
NoName 写道
首先还是表示感谢,顶一下,Cos 以前没听说过,这下又多了个选择


确实,支持以下
0 请登录后投票
   发表时间:2007-03-27  
以前都用fileupload,有机会看看cos,不知道lz测试的机器配置怎么样
0 请登录后投票
   发表时间:2007-05-08  

Cecily 写道:
呵呵  总结的很仔细啊 支持一下.我用SmartUpload做上传的时候确实觉得不好用于大数据量的传输.

 

 

支持一下,以前一个项目smartUpload大于20M时经常出现无响应的状况,的确让人苦恼。



0 请登录后投票
   发表时间:2007-05-08  
为什么有时候用smartUpload内存会100%呢
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics