EXTJS+JSP上传文件带进度条

需求来源是这样的:上传一个很大的excel文件到server, server会解析这个excel, 然后一条一条的插入到数据库,整个过程要耗费很长时间,因此当用户点击上传之后,需要显示一个进度条,并且能够根据后台的接收的数据量和处理的进度及时更新进度条。
分析:后台需要两个组件,uploadController.jsp用来接收并且处理数据,它会动态的把进度信息放到session,另一个组件processController.jsp用来更新进度条;当用户点“上传”之后,form被提交给uploadController.jsp,同时用js启动一个ajax请求到processController.jsp,ajax用获得的进度百分比更新进度条的显示进度,而且这个过程每秒重复一次;这就是本例的基本工作原理。
现在的问题是server接收数据的时候怎么知道接收的数据占总数据的多少? 如果我们从头自己写一个文件上传组件,那这个问题很好解决,关键是很多时候我们都是用的成熟的组件,比如apache commons fileupload; 比较幸运的是,apache早就想到了这个问题,所以预留了接口可以用来获取接收数据的百分比;因此我就用apache commons fileupload来接收上传文件。
uploadController.jsp:

[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*, java.io.*, org.apache.commons.fileupload.*, org.apache.commons.fileupload.disk.DiskFileItemFactory, org.apache.commons.fileupload.servlet.ServletFileUpload" pageEncoding="utf-8"%>  
  2. <%  
  3. //注意上面的import的jar包是必须的   
  4. //下面是使用apache commons fileupload接收上传文件;   
  5. FileItemFactory factory = new DiskFileItemFactory();  
  6. ServletFileUpload upload = new ServletFileUpload(factory);  
  7. //因为内部类无法引用request,所以要实现一个。   
  8. class MyProgressListener implements ProgressListener{  
  9.     private HttpServletRequest request = null;  
  10.     MyProgressListener(HttpServletRequest request){  
  11.         this.request = request;  
  12.     }  
  13.     public void update(long pBytesRead, long pContentLength, int pItems) {  
  14.         double percentage = ((double)pBytesRead/(double)pContentLength);  
  15.         //上传的进度保存到session,以便processController.jsp使用   
  16.         request.getSession().setAttribute("uploadPercentage", percentage);  
  17.     }  
  18. }  
  19. upload.setProgressListener(new MyProgressListener(request));  
  20. List items = upload.parseRequest(request);  
  21. Iterator iter = items.iterator();  
  22. while (iter.hasNext()) {  
  23.     FileItem item = (FileItem) iter.next();  
  24.     if (item.isFormField()){  
  25.           
  26.     } else {  
  27.         //String fieldName = item.getFieldName();   
  28.         String fileName = item.getName();  
  29.         //String contentType = item.getContentType();   
  30.        System.out.println();  
  31.         boolean isInMemory = item.isInMemory();  
  32.         long sizeInBytes = item.getSize();  
  33.         File uploadedFile = new File("c://" + System.currentTimeMillis() + fileName.substring(fileName.lastIndexOf(".")));  
  34.         item.write(uploadedFile);  
  35.     }  
  36. }  
  37. out.write("{success:true,msg:'保存上传文件数据并分析Excel成功!'}");  
  38. out.flush();  
  39. %>  

processController.jsp:

[java] view plaincopyprint?
  1. <%@ page language="java" import="java.util.*" contentType = "text/html;charset=UTF-8" pageEncoding="utf-8"%>  
  2. <%  
  3.     //注意上面的抬头是必须的。否则会有ajax乱码问题。   
  4.     //从session取出uploadPercentage并送回浏览器   
  5.     Object percent = request.getSession().getAttribute("uploadPercentage");  
  6.     String msg = "";  
  7.     double d = 0;  
  8.     if(percent==null){  
  9.         d = 0;  
  10.     }  
  11.     else{  
  12.         d = (Double)percent;  
  13.         //System.out.println("+++++++processController: " + d);   
  14.     }  
  15.     if(d<1){  
  16.     //d<1代表正在上传,   
  17.         msg = "正在上传文件...";  
  18.         out.write("{success:true, msg: '"+msg+"', percentage:'" + d + "', finished: false}");  
  19.     }  
  20.     else if(d>=1){  
  21.         //d>1 代表上传已经结束,开始处理分析excel,   
  22.         //本例只是模拟处理excel,在session中放置一个processExcelPercentage,代表分析excel的进度。   
  23.         msg = "正在分析处理Excel...";  
  24.         String finished = "false";  
  25.         double processExcelPercentage = 0.0;  
  26.         Object o = request.getSession().getAttribute("processExcelPercentage");  
  27.         if(o==null){  
  28.             processExcelPercentage = 0.0;  
  29.             request.getSession().setAttribute("processExcelPercentage"0.0);  
  30.               
  31.         }  
  32.         else{  
  33.             //模拟处理excel,百分比每次递增0.1    
  34.             processExcelPercentage = (Double)o + 0.1;  
  35.             request.getSession().setAttribute("processExcelPercentage", processExcelPercentage);  
  36.             if(processExcelPercentage>=1){  
  37.                 //当processExcelPercentage>1代表excel分析完毕。   
  38.                 request.getSession().removeAttribute("uploadPercentage");  
  39.                 request.getSession().removeAttribute("processExcelPercentage");  
  40.                 //客户端判断是否结束的标志   
  41.                 finished = "true";  
  42.             }  
  43.         }  
  44.         out.write("{success:true, msg: '"+msg+"', percentage:'" + processExcelPercentage + "', finished: "+ finished +"}");  
  45.         //注意返回的数据,success代表状态   
  46.         //percentage是百分比   
  47.         //finished代表整个过程是否结束。   
  48.     }  
  49.     out.flush();  
  50. %>  

表单页面upload.html:

[xhtml] view plaincopyprint?
  1. <html>  
  2.     <head>  
  3.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  4.         <title>File Upload Field Example</title>  
  5.         <link rel="stylesheet" type="text/css"  
  6.             href="ext/resources/css/ext-all.css" />  
  7.         <script type="text/javascript" src="ext/adapter/ext/ext-base.js"> </script>  
  8.         <script type="text/javascript" src="ext/ext-all.js"> </script>  
  9.         <style>  
  10. </style>  
  11.     </head>  
  12.     <body>  
  13.         <a href="http://blog.csdn.net/sunxing007">sunxing007</a>  
  14.         <div id="form"></div>  
  15.     </body>  
  16.     <script>  
  17. var fm = new Ext.FormPanel({  
  18.     title: '上传excel文件',  
  19.     url:'uploadController.jsp?t=' + new Date(),  
  20.     autoScroll:true,  
  21.     applyTo: 'form',  
  22.     height: 120,  
  23.     width: 500,  
  24.     frame:false,  
  25.     fileUpload: true,  
  26.     defaultType:'textfield',  
  27.     labelWidth:200,  
  28.     items:[{  
  29.         xtype:'field',  
  30.         fieldLabel:'请选择要上传的Excel文件 ',  
  31.         allowBlank:false,  
  32.         inputType:'file',  
  33.         name:'file'  
  34.     }],  
  35.     buttons: [{  
  36.         text: '开始上传',  
  37.         handler: function(){  
  38.             //点击'开始上传'之后,将由这个function来处理。  
  39.             if(fm.form.isValid()){//验证form, 本例略掉了  
  40.             //显示进度条  
  41.                 Ext.MessageBox.show({   
  42.                     title: '正在上传文件',   
  43.                     //msg: 'Processing...',   
  44.                     width:240,   
  45.                     progress:true,   
  46.                     closable:false,   
  47.                     buttons:{cancel:'Cancel'}   
  48.                 });   
  49.                 //form提交  
  50.         fm.getForm().submit();  
  51.         //设置一个定时器,每500毫秒向processController发送一次ajax请求  
  52.             var i = 0;  
  53.             var timer = setInterval(function(){  
  54.                     //请求事例  
  55.                   Ext.Ajax.request({  
  56.                   //下面的url的写法很关键,我为了这个调试了好半天  
  57.                   //以后凡是在ajax的请求的url上面都要带上日期戳,  
  58.                   //否则极有可能每次出现的数据都是一样的,  
  59.                   //这和浏览器缓存有关  
  60.                         url: 'processController.jsp?t=' + new Date(),  
  61.                         method: 'get',  
  62.                         //处理ajax的返回数据  
  63.                         success: function(response, options){  
  64.                             status = response.responseText + " " + i++;  
  65.                             var obj = Ext.util.JSON.decode(response.responseText);  
  66.                             if(obj.success!=false){  
  67.                                 if(obj.finished){  
  68.                                     clearInterval(timer);     
  69.                                     //status = response.responseText;  
  70.                                     Ext.MessageBox.updateProgress(1, 'finished', 'finished');  
  71.                                     Ext.MessageBox.hide();  
  72.                                 }  
  73.                                 else{  
  74.                                     Ext.MessageBox.updateProgress(obj.percentage, obj.msg);   
  75.                                 }  
  76.                             }  
  77.                         },  
  78.                         failure: function(){  
  79.                             clearInterval(timer);  
  80.                             Ext.Msg.alert('错误', '发生错误了。');  
  81.                         }   
  82.                     });  
  83.             }, 500);  
  84.                   
  85.             }  
  86.             else{  
  87.                 Ext.Msg.alert("消息","请先选择Excel文件再上传.");  
  88.             }  
  89.         }   
  90.     }]  
  91. });  
  92. </script>  
  93. </html>  
  

把这三个文件放到tomcat/webapps/ROOT/, 同时把ext的主要文件也放到这里,启动tomcat即可测试:http://localhost:8080/upload.html
我的资源里面有完整的示例文件:http://download.csdn.net/detail/hanghangaidoudou/4987201, 下载zip文件之后解压到tomcat/webapps/ROOT/即可测试。

最后需要特别提醒,因为用到了apache 的fileUpload组件,因此,需要把common-fileupload.jar放到ROOT/WEB-INF/lib下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android Json详解

Json:一种轻量级的数据交换格式&#xff0c;具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案&#xff08;有点类似于正则表达式 &#xff0c;获得了当今大部分语言的支持&#xff09;&#xff0c;从而可以在不同平台间进行数据交换。JSON采用兼容性…

react实践

React 最佳实践一、 React 与 AJAXReact 只负责处理 View 这一层&#xff0c;它本身不涉及网络请求 /AJAX: 第一&#xff0c;用什么技术从服务端获取数据&#xff1b; 第二&#xff0c;获取到的数据应该放在 react 组件的什么位置。 事实上是有很多的&#xff1a;fetch()、fetc…

什么样的代码是好代码_什么是好代码?

什么样的代码是好代码编码最佳实践 (Coding Best-Practices) In the following section, I will introduce the topic at hand, giving you a sense of what this post will cover, and how each argument therein will be approached. Hopefully, this will help you decide w…

nginx比较apache

话说nginx在大压力的环境中比apache的表现要好&#xff0c;于是下载了一个来折腾一下。 下载并编译安装&#xff0c;我的编译过程有点特别&#xff1a; 1。去除调试信息&#xff0c;修改$nginx_setup_path/auto/cc/gcc这个文件&#xff0c;将 CFLAGS"$CFLAGS -g" …

计算机主板各模块复位,电脑主板复位电路工作原理分析

电源、时钟、复位是主板能正常工作的三大要素。主板在电源、时钟都正常后&#xff0c;复位系统发出复位信号&#xff0c;主板各个部件在收到复位信号后&#xff0c;同步进入初始化状态。如图7-11所示为复位电路的工作原理图&#xff0c;各个十板实现复位的电路不尽相同&#xf…

Docker制作dotnet core控制台程序镜像

(1)首先我们到某个目录下&#xff0c;然后在此目录下打开visual studio code. 2.编辑docker file文件如下: 3.使用dotnet new console创建控制台程序; 4.使用docker build -t daniel/console:dev .来进行打包; 5.启动并运行镜像; 6.我们可以看到打包完的镜像将近2G,因为我们使用…

【362】python 正则表达式

参考&#xff1a;正则表达式 - 廖雪峰 参考&#xff1a;Python3 正则表达式 - 菜鸟教程 参考&#xff1a;正则表达式 - 教程 re.match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match()就返回none。 re.search 扫描整个字符串并…

在Python中使用Twitter Rest API批量搜索和下载推文

数据挖掘 &#xff0c; 编程 (Data Mining, Programming) Getting Twitter data获取Twitter数据 Let’s use the Tweepy package in python instead of handling the Twitter API directly. The two things we will do with the package are, authorize ourselves to use the …

第一套数字电子计算机,计算机试题第一套

《计算机试题第一套》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《计算机试题第一套(5页珍藏版)》请在人人文库网上搜索。1、计算机试题第一套1、计算机之所以能自动运算,就是由于采用了工作原理。A、布尔逻辑。B 储存程序。C、数字电路。D,集成电路答案选B2、“长…

Windows7 + Nginx + Memcached + Tomcat 集群 session 共享

一&#xff0c;环境说明 操作系统是Windows7家庭版&#xff08;有点不专业哦&#xff0c;呵呵&#xff01;&#xff09;&#xff0c;JDK是1.6的版本&#xff0c; Tomcat是apache-tomcat-6.0.35-windows-x86&#xff0c;下载链接&#xff1a;http://tomcat.apache.org/ Nginx…

git 版本控制(一)

新建代码库repository 1、在当前目录新建一个git代码库 git init git init projectname 2、下载一个项目&#xff0c;如果已经有了远端的代码&#xff0c;则可以使用clone下载 git clone url 增加/删除/改名文件 1、添加指定文件到暂存区 git add filename 2、添加指定目录到暂…

rollup学习小记

周末在家重构网关的Npm包&#xff0c;用到了rollup&#xff0c;记下笔记 rollup适合库library的开发&#xff0c;而webpack适合应用程序的开发。 rollup也支持tree-shaking&#xff0c;自带的功能。 package.json 也具有 module 字段&#xff0c;像 Rollup 和 webpack 2 这样的…

大数据 vr csdn_VR中的数据可视化如何革命化科学

大数据 vr csdnAstronomy has become a big data discipline, and the ever growing databases in modern astronomy pose many new challenges for analysts. Scientists are more frequently turning to artificial intelligence and machine learning algorithms to analyze…

object-c 日志

printf和NSlog区别 NSLog会自动加上换行符&#xff0c;不需要自己添加换行符&#xff0c;NSLog会加上时间和进程信息&#xff0c;而printf仅将输入的内容输出不会添加任何额外的东西。两者的输入类型也是有区别的NSLog期待NSString*&#xff0c;而printf期待const char *。最本…

计算机真正管理的文件名是什么,计算机题,请大家多多帮忙,谢谢

4、在资源管理器中&#xff0c;若想显示文件名、文件大小和文件类型&#xff0c;应采用什么显示方式。( )A、小图标显示 B、列表显示 C、详细资料显示 D、缩略图显示5、在EXCEL中&#xff0c;可以依据不同要求来提取和汇总数据&#xff0c;4、在资源管理器中&#xff0c;若想显…

小a的排列

链接&#xff1a;https://ac.nowcoder.com/acm/contest/317/G来源&#xff1a;牛客网小a有一个长度为nn的排列。定义一段区间是"萌"的&#xff0c;当且仅当把区间中各个数排序后相邻元素的差为11 现在他想知道包含数x,yx,y的长度最小的"萌"区间的左右端点 …

Xcode做简易计算器

1.创建一个新项目&#xff0c;选择“View-based Application”。输入名字“Cal”&#xff0c;这时会有如下界面。 2.选择Resources->CalViewController.xib并双击&#xff0c;便打开了资源编辑对话框。 3.我们会看到几个窗口。其中有一个上面写着Library&#xff0c;这里…

计算机 编程 教程 pdf,计算机专业教程-第3章编程接口介绍.pdf

下载第3章 编程接口介绍• DB2 UDB应用程序概述• 嵌入S Q L编程• CLI/ODBC应用程序• JAVA应用程序• DAO 、R D O 、A D O应用程序本章将介绍对DB2 UDB 可用的编程方法及其特色&#xff0c;其中一些方法附有简单的例子&#xff0c;在这些例子中&#xff0c;有些并不是只适用…

导入数据库怎么导入_导入必要的库

导入数据库怎么导入重点 (Top highlight)With the increasing popularity of machine learning, many traders are looking for ways in which they can “teach” a computer to trade for them. This process is called algorithmic trading (sometimes called algo-trading)…

windows查看系统版本号

windows查看系统版本号 winR,输入cmd&#xff0c;确定&#xff0c;打开命令窗口&#xff0c;输入msinfo32&#xff0c;注意要在英文状态下输入&#xff0c;回车。然后在弹出的窗口中就可以看到系统的具体版本号了。 winR,输入cmd&#xff0c;确定&#xff0c;打开命令窗口&…