基于Java Web的文件上传进度显示的一种解决方案

类别:Java 点击:0 评论:0 推荐:

在Web应用开发中,常常会遇到文件的上传下载模块,下载文件时无论IE还是常用的flashget等下载软件都提供了友好的下载进度显示,可以让用户很清晰的了解到下载的进度,特别是在进行大文件传输时,为用户提供了非常舒服的感觉...可以想像,一个几百M或者上G的文件传输过程没有进度显示,是一件多么让人无法忍受的事情。

?然而在如今大多数的服务器上传组件中却没能提供文件上传进度的显示功能或相应开发接口,当进行大文件上传操作或低速网络上传时,长时间的无知状态常常使用户不知所措。

?本文(及附上的相应组件)提供了一套基于Java Web的HTTP文件上传进度显示的解决方案,可以应用于jsp,servlet的web应用开发中,它由apache的commons-fileupload-1.0组件扩展而来,没有改动任何原有组件代码,进度显示部分完全以一种扩展组件形式出现,你可以随时使用或不使用此显示组件,而无需对原有上传应用程序进行大规模的变动。

ahxu-commons-fileuploadex-1.0在apache的commons-fileupload-1.0的基础上扩展了以下功能:

1.增加了文件类型检测功能,可以设定上传文件的类型,不被允许上传的文件将不能上传;
2.增加了对非文件域表单上传的过滤功能,可以选择或不选择上传接收非文件域的表单内容;
3.增加了文件上传进度报告功能,动态报告上传文件的文件名、大小、速度、总时间、剩余时间等,并提供了基于此进度报告功能的一种解决方案;


安装(以tomcat-5.0.27为例):
1.下载apache的commons-fileupload-1.0组件
下载地址http://apache.linuxforum.net/dist/jakarta/commons/fileupload/binaries/commons-fileupload-1.0.zip
2. 下载ahxu的ahxu-commons-fileuploadex-1.0组件
下载地址http://www.lizonghan.com/ahxu/ahxu-commons-fileuploadex-1.0.jar
3. 将此二个.jar文件放入一个已配置好的web应用的WEB-INF\lib目录下,例如:test\WEB-INF\lib
测试:
1.下载应用测试代码upload-jsp.rar,下载地址http://www.lizonghan.com/ahxu/upload-jsp.rar ,解压放在此web应用的根目录,例如:test\
2.运行测试upload.jsp,要求IE5.0以上,例如:http://127.0.0.1/test/upload.jsp
3.选择一个或二个大点儿的文件,最好几百M,然后上传,上传过程中会弹出一个进度对话框,如图


图1 文件上传进度显示对话框

4.文件上传完毕后将显示上传结果,进度对话框自动关闭。
注:以上过程在win2000+sp4+tomcat5.0.27+IE6.0测试通过,其它环境是否能正常运行,希望大家测试后将信息反馈给我,谢谢!

有用的upload-jsp.rar:

upload-jsp.rar中包含的4个文件:upload.jsp、receive.jsp、progressbar.jsp、progressdetail.jsp

1.upload.jsp——文件上传表单页面;
此页面包含了文件上传的form表单,当然也可以是你的应用中任何你喜欢的有文件上传form表单的页面。此页面在submit时调用javascript函数uploadBegin()弹出进度显示对话框(显示progressbar.jsp);你也可以根据需要自己定制,例如不用对话框,用iframe等。但form的onSubmit时要调用uploadBegin(),如:

<script language="javascript">
function uploadBegin(){
 theFeats = "height=200,width=320,location=no,menubar=no,resizable=no,scrollbars=no,status=no,toolbar=no";
 strAppVersion = navigator.appVersion;
 if (document.uploadForm.file1.value != "")
 {
     if (strAppVersion.indexOf('MSIE') != -1 && strAppVersion.substr(strAppVersion.indexOf('MSIE')+5,1) > 4)
     { 
   winstyle = "dialogWidth=320px; dialogHeight:200px; center:yes";
   window.showModelessDialog(<%="\""+response.encodeURL("progressbar.jsp")+"\""%>,window,winstyle);
     }
 }
}
</script>

<form action=<%="\""+response.encodeURL("receive.jsp")+"\""%> enctype="multipart/form-data" method="post" name="uploadForm" id="uploadForm" onsubmit="uploadBegin();">

2.receive.jsp——文件上传接收页,即服务器端接收上传数据并处理上传数据的页面,可以用servlet来代替;

<%

List fileItemList=null;
//DiskFileUpload fu = new DiskFileUpload();//初使化使用原有apache的upload
DiskFileUploadEx fu = new DiskFileUploadEx();//初使化ahxu扩展后的组件
fu.setSizeMax(1000*1024*1024);//原有apache的upload:设置允许上传的最大值
fu.setAllowFiles(".txt;.jpg;.rm");//ahxu扩展后:设置允许的上传文件类型

try{
 
 //fileItemList=fu.parseRequest(request);//使用原有apache的upload:由request接收上传文件
 fileItemList=fu.parseRequestExSessionReport(request);//ahxu扩展后的:接收上传文件
 Iterator fileItemListIte=fileItemList.iterator();
 while(fileItemListIte.hasNext())
 {
  FileItem file=(FileItem)fileItemListIte.next();
  out.println(file.getName()+"<br>");
//此处进行文件处理
 }
 out.println("上传成功");
}catch (Exception e){
 out.println("上传失败<br>");
 out.println(e.getMessage());
 /*显示不被允许上传的文件列表,原有apache的upload无此部分 begin*/
 if(e instanceof DiskFileUploadEx.InvalidFileUploadException){
  out.println("<p>以下文件不被允许:</p>");
  Iterator unAllowFileS=((DiskFileUploadEx.InvalidFileUploadException)e).getInvalidFileList().iterator();
  while(unAllowFileS.hasNext()){
   out.println((String)unAllowFileS.next()+"<br>");
  }
 /*显示不被允许上传的文件列表,原有apache的upload无此部分 end */
 }

}
finally{
Thread.sleep(1000);
fu.clear(request);//ahxu扩展后的组件:接收上传文件后的清理工作,原有apache组件没有此过程
}
%>

3.progressbar.jsp——文件上传进度显示页,如图1;
你也可以根据自己的需要定制自己样式的进度显示页面。
4.progressdetail.jsp——文件上传进度数据读取页,用来构造上传进度信息,供progressbar.jsp读取显示,无需修改

简单应用部署的总结:
1.下载安装apache的commons-fileupload-1.0组件及ahxu-commons-fileuploadex-1.0组件;
2.编辑上传表单文件,注意要复制upload.jsp的uploadBegin(),以及form表单的onsubmit="uploadBegin();"
3.复制progressbar.jsp、progressdetail.jsp无需修改;
4.根据需要编辑receive.jsp页的内容。

欢迎大家一起讨论http://blog.csdn.net/ahxu

附:

1.关于apache的commons-fileupload-1.0官方介绍
2.利用commons-fileupload组件上传文件至服务器和数据库?

本文地址:http://com.8s8s.com/it/it16151.htm