Spring Boot+AngularJS+BootStrap实现进度条示例代码
SpringBoot+AngularJS+BootStrap实现进度条
原理
进度条的原理是在上传文件的时候,当程序运行到某一个部分,往Session中设置一个1到100的值。然后前台再每隔很小的一段时间去请求这个值。
在AngularJS中,$http对象有3种状态,分别是success,progress,error,其中progress方法就会在success方法调用之前(也就是上传完成之前),不断地调用。而我们要做的就是在progress中在添加一个请求,去后台拿我们设置在session中的值。
代码,这里我用了一个插件用来上传文件,叫ng-file-upload
html
确认
js
Upload.upload( { url:"", data:{ file:file }, method:'post' }).then(function(res){ //这里是success方法 $scope.isShowMsg=true; $scope.Msg=res.data.msg; if($scope.Msg=="导入数据不符合格式要求!") $scope.type="progress-barprogress-bar-dangerprogress-bar-striped";//设置进度条样式 else{ $scope.type="progress-barprogress-bar-successprogress-bar-striped"; $scope.progress=100;//上传成功之后,将进度条设置为100 } },function(){ //这里是error方法 },function(){ //这里是progress方法 $scope.type="progress-barprogress-bar-infoprogress-bar-striped"; $http({ url:"", method:"get" }).success(function(res){ $scope.progress=res;//绑定进度条的值 }) });
上传部分代码(只需要关注设置session的地方
publicMapbatchModify(InputStreaminputStream,HttpSessionsession){ Map res=newHashMap<>(); Workbookworkbook=null; try{ workbook=Util.createWorkbook(inputStream); }catch(InvalidFormatException|IOExceptione){ e.printStackTrace(); } session.setAttribute("progress",5);//解析成功后我将进度设置为5 Sheetsheet=workbook.getSheetAt(0); Map roleWithPages=newHashMap<>(); for(inti=1;i<=sheet.getLastRowNum();i++){ Rowr=sheet.getRow(i); if(r==null||r.getCell(0)==null||r.getCell(1)==null) continue; Set pages=null; if(roleWithPages.get(r.getCell(0).toString())==null){ pages=newHashSet<>(); }else{ pages=(Set )roleWithPages.get(r.getCell(0).toString()); } Pagep=newPage(); p.setId(Math.round(r.getCell(1).getNumericCellValue())); pages.add(p); roleWithPages.put(r.getCell(0).toString(),pages); session.setAttribute("progress",5+i*90/sheet.getLastRowNum()); //我将处理文件主体进度总量设置为90(5是加上解析部分的进度) } List roles=newArrayList<>(); for(Stringrolename:roleWithPages.keySet()){ Rolerole=repo.findByName(rolename); role.setPages((Set )roleWithPages.get(rolename)); roles.add(role); } repo.save(roles); session.setAttribute("progress",100);//保存之后将进度设置为100 res.put("msg","数据导入成功!"); returnres; }
进度条部分代码,很简单,就是读Session中progress的值
publicintgetProgress(HttpServletRequestrequest){ return(int)request.getSession().getAttribute("progress"); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。