时间:2020-12-22 18:16:12 | 栏目:AngularJS | 点击:次
现在的项目,无论代销,几乎不会缺省的一个功能就是上传下载功能,今天谈一谈使用AngularJS+bootsrtap下的上传下载功能。
1.angularjs和flowjs
angularjs我在其他的博客里面也讲到了它的其他的一些用处,只是没有做过系统的说明,在这里也不打算一一介绍。这个在一些官网上都有说明,我也会花一点时间去整理一下angularjs的知识点以及在使用到angularjs需要注意的或者我在项目中碰到的一些问题,会在其他博客中跟大家分享。这里我只简单的一笔带过,主要是flowjs这个组件的使用。顺便一提,还得夸夸angularjs的强大。
1.1 flowjs
https://github.com/flowjs/flow.js,这个网站上是我见到过对flowjs这部分描述最清楚的API了,上面列举了flowjs作为angular下的上传组件的使用以及属性的详细讲解。我主要列举flowjs常用的一些属性以及使用时需要注意的问题
1.2flowjs属性
<form class="panel panel-default" flow-init="{target: 'url',singleFile:false,testChunks:false}" flow-name="vm.flow" flow-files-added="!!{pem:1}[$file.getExtension()]" flow-file-success="vm.action.importCAData($message)"> </form>
这是一个最简单的实现上传功能的代码,里面包含了一些属性和方法,其他的一些参数这里暂时用不到,感兴趣的请到上面的网站去查阅。
<span style="font-size:18px;" deep="8">{ "flow-init":"初始化上传的属性值", "target":"请求接口路径,对应到后台server端请求", "singleFile":"是否选择单文件上传,因为flowjs默认是支持多文件上传的, 当然也有的需求会需要单文件上传,取值为true或false." "true是只支持单文件上传,false支持多文件上传,记得一定是boolean类型的." "testChunks":"flowjs上传是分片的,所以他不会只往后台发送一次请求,如果文件比较大, 它会分多片上传,然后等所有的都上传文成," "他会去合成一个整体的文件,而这个属性设置为true之后就会去检测一下该请求在后台是否开启, 如果开了就会在下次即使重启或者浏览器奔溃后继续上传,我的理解应该是续传吧", "flow-files-added":"可以用来限制上传文件的格式,比如excel,pem,jpeg,png等格式要求!!{pem:1,png:1}", "flow-file-success":"上传成功之后的回调函数,你可以在这里面处理上传之后的其他操作。比如使用这个组件的时候会和其他表单项一起提交", "这时我们需要将文件的上传路径,文件名字和其他表单项一起提交到后台,而该组件不支持参数传递,也就是使用这个组件", "分为两步,第一步:点击上传,先将文件上传到服务器指定路径。同时后台返回文件路径,文件大小,文件名称等与文件相关的信息", "第二步:将后台返回的文件信息和其他表单项一起封装到一个对象中,发送给后台。后台接到请求,将上传信息进行入库操作" }</span>
1.3实例
上面已经对flowjs进行了一个说明,在这里举个例子来使用一下该组件。关于引入js,我就不详细说了。
1.3.1组件配置
html代码(里面有些我们自定义的样式我就没有删除):
<form class="panel panel-default" flow-init="{target: 'api/ham/tool/certificate/importCa',singleFile:true,testChunks:false}" flow-name="vm.flow" flow-file-added="!!{pem:1}[$file.getExtension()]" flow-file-success="vm.action.importCAData($message)"> <div class="panel-heading"> <h4 class="app-heading"> upload file </h4> </div> <div class="panel-body"> <div class="form-horizontal"> <div class="asterisk-info">{{::'button-label.asterisk' | i18next }}</div> <div class="form-group"> <label class="col-md-3 control-label">*{{::'am.secondaryMenu.tools.certificate.item.uploadCAFile'|i18next}}</label> <div class="col-md-6 " style="background-color:#eee;"> <div class="file-name-list" style="min-height: 10em;"> <p ng-repeat="file in $flow.files" style="margin:10px 0px;"> {{$index+1}} {{file.name}} </p> </div> </div> <span class="btn btn-primary col-md-1" style="margin-left: 20px;" flow-btn>{{::'am.secondaryMenu.tools.certificate.item.upload'|i18next}}</span> </div> </div> </div> <div class="panel-footer"> <div class="text-right"> <button id="sampleOne-edit" type="button" class="btn btn-primary" ng-click="vm.action.commitCAFile($flow)" ng-disabled="$flow.files.length < 1" title="{{::'button-label.import' | i18next}}">{{::'button-label.import' | i18next}} </button> </div> </div> </form>
从这里我们可以看出,组件是基于form表单的,当然你也可以基于其他dom节点上,基于表单的好处主要是在于表单的提交即submit按钮可以直接帮到到文件上传的$flow.upload方法上,当用户选择文件后,点击上传就会执行上传方法,在整个form表单中该$flow是全局存在的,这样我们就可以根据文件的大小或者是否选择文件来确定是否允许用户上传,为了缓解服务器压力,我们一般是不会让用户提交一些误操作的。
1.3.2方法处理
上传方法:$flow.upload
上传成功的回调函数:
vm.action.importCAData = function (responseResult) { console.info('importCAData'); vm.action.CAName = angular.fromJson(responseResult).data; //var data = responseResult.data; //data.keyPasswd = vm.cache.currentItem.keyPasswd; var result = angular.fromJson(responseResult).result; var errorMessage = angular.fromJson(responseResult).errorMessage; if(result == "success"){ vm.cache.caFlag = true; vm.cache.alert._success("Upload CA certificates successfully!", vm.alertConfig); }else { vm.caDisabled = false; vm.cache.alert._error(errorMessage, vm.alertConfig); } }
在这里的处理是将后台返回的文件相关的属性赋值给其他变量。当我们存在其他表单项的时候,需要将该文件的一些属性和表单项封装到同一个对象中发送给后台,让后台进行一些入库操作。
表单提交操作:
//save the form vm.action.createItem = function () { vm.action.data.keyPasswd = vm.cache.currentItem.keyPasswd; vm.action.data.CAName = vm.action.CAName; var data = {}; data.caFileName = vm.action.CAName; data.fileName = vm.action.data.fileName; data.from = vm.action.data.from; data.isExpiryStatus = vm.action.data.isExpiryStatus; data.name = vm.action.data.name; data.to = vm.action.data.to; data.type = vm.action.data.type; data.keyPasswd = vm.cache.currentItem.keyPasswd; data.usingStatus = vm.action.data.usingStatus; data.validityStartTime = vm.action.data.validityStartTime; data.validityStopTime = vm.action.data.validityStopTime; amCertificateService.createItem(data).then(function success(responseResult) { if (responseResult.errorCode == 0) { vm.action.reset(); vm.cache.alert._success('Create radius server certificate successfully ', vm.alertConfig); } else { vm.cache.alert._error(responseResult.translated.errorMessageTranslated, vm.alertConfig); } amCertificateService.getList(); }) .catch(function fail(e) { vm.cache.alert._error(""); }) .finally(function () { vm.action.reset(); }); };
1.4后台处理
后天处理我就不多说了,自从搞上了前端,后台的代码我都挺长时间没动过了,感觉挺悲哀的。但是后天使用的是springmvc,springmvc的上传类叫MultipartFile,当然你也可以使用HttpServletRequest ,这个里面也可以转为上面的那个类。这个网上一搜一大片,我就不多说了。至此,文件上传功能就这样实现了
总结