浏览 13629 次
锁定老帖子 主题:文件上传组件的比较与使用续
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-03-06
从上述的表格对比中可以看出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中 2. 编写一个html文件uploadExample.htm: 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文件: 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下即可 附:(http://blog.csdn.net/hdhero/archive/2005/03/22/326405.aspx) 一.SmartUpload组件例子代码: <%@ 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或内存占用过高的问题.只有重新启动容器才能恢复正常! 二.commons-fileupload组件 <%@ page language=“java”contentType=“text/html;charset=GBK”%> <%@ page import=“java.util.*”%> <%@ page import=“org.apache.commons.fileupload.*”%> <html> <head> <title>文件上传</title> </head> <% DiskFileUpload fu = new DiskFileUpload(); // 设置允许用户上传文件大小,单位:字节 fu.setSizeMax(10000000); // 设置最多只允许在内存中存储的数据,单位:字节 fu.setSizeThreshold(4096); // 设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录 fu.setRepositoryPath(“D:\\Tomcat5\\TEMP”); //开始读取上传信息 List fileItems = fu.parseRequest(request); // 依次处理每个上传的文件 Iterator iter = fileItems.iterator(); while (iter.hasNext()) { FileItem item = (FileItem) iter.next(); //忽略其他不是文件域的所有表单信息 if (!item.isFormField()) { String name = item.getName(); item.write(“D:\\UploadTest\\”+ name); } } %> 有关FileUpload组件的使用和调试的经验<o:p></o:p> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-04-04
不错,讲的很详细
|
|
返回顶楼 | |
发表时间:2007-04-05
Spring的multipart的封装应该更简洁,易用。而且非常方便在common-upload与cos之间切换。
|
|
返回顶楼 | |