AngularJS封装webupload实现文件夹上传
百度的webupload没有开放api获取整个文件夹的信息。本文是二次开发webupload实现获取文件夹信息。
指令封装
/**
* @license lx.ui.framework v1.0.0
* (c) 2017-2018 lx, Inc.n
* @author lx
*/
(function(window, undefined ) { 'use strict';
//设置lx.ui.upload的配置信息
var $$runtime = {file:'/api/1.0/upload/add', "swf":"",debug : true}; var lxUiUpload=angular.module("lx.ui.upload",[]); /**
* 在lx.ui.framework上声明lx-ui-upload指令
*
*/
lxUiUpload.directive('lxUiUpload',function($lx){
var option = {
restrict : 'E',
replace : true,
template : '<div>上传文件</div>',
scope:true,
link : function($scope, $element, $attrs) {
//声明作用域内上传数据对象
$scope.upload={"id":"","droparea":"","md5":"","length":0,"data":[],"tip":true,"isupload":false,"progress":[],"isprogress":true,"total":0};
//设置上传文件id
$scope.upload.id="#"+$attrs.id;
$scope.upload.droparea="."+$attrs.droparea;
WebUploader.Uploader.register({
"before-send-file" : "beforeSendFile"
}, {
// 时间点1:所有分块进行上传之前调用此函数
beforeSendFile : function(file) {
var deferred = WebUploader.Deferred();
// 1、使用md5计算文件的唯一标记,用于断点续传
uploader.md5File(file).then(function(val) {
$scope.upload.md5= val;
// 2.1.5延迟解决
deferred.resolve();
});
return deferred.promise();
},
});
var uploader = WebUploader.create({
// swf文件路径
swf : $$runtime.swf,
// 文件接收服务端。
server : $$runtime.file,
// 选择文件的按钮。可选。
// 内部根据当前运行是创建,可能是input元素,也可能是flash.
pick : {
id : $scope.upload.id,
// 这个id是你要点击上传文件的id,自己设置就好</span>
multiple : true
},
// 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
resize : true,
dnd:$scope.upload.droparea,
auto : true,
// 上传并发数
threads : 5,
// 开启分片上传
chunked : true,
chunkSize : 1 * 1024 * 1024,
duplicate :true
});
// 声明WebUploader内【uploadBeforeSend】事件
$scope.$on("isupl",function(event,node){
if(node===1){
$scope.upload.isupload=true;
}else{
$scope.upload.isupload=false;
}
});
uploader.on("beforeFileQueued", function(file) {
// if(!$scope.upload.isupload){
// alert("您好:你没得在该文件夹下上传文件的权限!",1);
// return false;
// }
});
// 声明WebUploader内【uploadBeforeSend】事件
uploader.on("fileQueued", function(file, data) {
if($scope.upload.length==0){
//清空文件进度条
$scope.upload.progress=[];
$scope.upload.total=0;
$lx.show("","/upload/upload/templates/progress.html","lx_progress_ctrl","lg",$scope);
}
$scope.upload.progress.push({id:file.id,size:file.size,name:file.name,type:file.type,percentage:"0"+'%'});
$scope.upload.length++;
// wenbuploader添加携带参数
});
// 声明WebUploader内【uploadBeforeSend】事件
uploader.on("uploadBeforeSend", function(block, data) {
// wenbuploader添加携带参数
data.fileMd5 = $scope.upload.md5;
});
// 声明WebUploader内【uploadProgress】事件
uploader.on( 'uploadProgress', function(file, percentage ) {
angular.forEach($scope.upload.progress,function(v){
if(v.id==file.id){
v.percentage=Math.round(percentage * 100) + '%';
}
});
$scope.$apply();
});
// 声明WebUploader内【拼装文件地址】事件,实现获取文件夹和文件的逻辑
function assemblepath(folders,files){
//循环folders
//console.log(angular.toJson(folders.folders));
angular.forEach(folders.folders,function(v){
angular.forEach(v.files,function(f){
//循环上传的文件
angular.forEach(files,function(i,index){
if(f.name==i.name){
f.md5==undefined?"0":f.md5;
f.size==undefined?"0":f.size;
f.type==undefined?"999":f.type;
f.md5=i.md5;
f.size=i.size;
f.type=i.type;
files.splice(index,1);
} });
});
assemblepath(v,files);
});
}
// 声明WebUploader内【uploadSuccess】事件
uploader.on("uploadSuccess", function(file, response) { $scope.upload.total++;
$scope.upload.data.push(response[0]);
$scope.upload.length--;
if($scope.upload.length==0){
var isdrop=false;
//判断拖拽还是选择文件上传
var file={};
try{
file=angular.fromJson(localStorage.getItem("file"));
//获取到的文件夹和文件信息
alert(angular.toJson(file))
if(file==""||file==null){
file={};
isdrop=false;
}else{
isdrop=true;
};
}catch(e){ }
//如果是拖拽
if(isdrop){
try{
angular.forEach(file.files,function(f){
angular.forEach($scope.upload.data,function(i,index){
if(f.name==i.name){
debugger;
f.md5==undefined?"0":f.md5;
f.size==undefined?"0":f.size;
f.type==undefined?"999":f.type;
f.md5=i.md5;
f.size=i.size;
f.type=i.type;
$scope.upload.data.splice(index,1);
}
});
});
assemblepath(file, $scope.upload.data);
}catch(e){ }
}else{
file.files=[];
file.files=$scope.upload.data;
}
$scope.$emit('upload', file);
$scope.upload.data=[];
$util.set("file","");
file={};
isdrop=false;
}
});
}
}; return option;
});
})();
使用:
<lx-ui-upload droparea="lx-ui-panel" id="upload" type="button" class="lx-ui-button orange r" value="上传文件" style="width:80px;"></lx-ui-upload>
效果:
内附源码
AngularJS封装webupload实现文件夹上传的更多相关文章
- 文件夹上传插件webupload插件
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
- 文件夹上传控件webupload插件
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- vue文件夹上传组件选哪个好?
一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...
- Java Web 项目的文件/文件夹上传下载
需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...
- js文件夹上传下载组件
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...
- java文件夹上传下载组件
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...
- vue文件夹上传源码
一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...
- php+文件夹上传实例
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...
- java+http文件夹上传
在web项目中上传文件夹现在已经成为了一个主流的需求.在OA,或者企业ERP系统中都有类似的需求.上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便.能够提供更高级的应用支撑. ...
随机推荐
- (整理)在REHL6.5上部署ASP.NET MVC
最近项目要使用Linux服务器(REHL6.5)+MySQL,因此特尝试操作. 1 Linux 安装Jexus 1.1 下载Jexus 因为服务器没有安装Xwindows,Jexus的下载又出现问题, ...
- CSS笔试题
如何实现移动端9宫格 如何实现移动端下列8宫格 实现移动端图片画廊CSS样式 写一个简单的animation的css动画 美化select,radio,range样式,只需考虑谷歌浏览器,下面给出的是 ...
- 格式化hdfs后,hadoop集群启动hdfs,namenode启动成功,datanode未启动
集群格式化hdfs后,在主节点运行启动hdfs后,发现namenode启动了,而datanode没有启动,在其他节点上jps后没有datanode进程!原因: 当我们使用hdfs namenode - ...
- Android单元测试学习(一)
什么是单元测试 首先总结一下什么是单元测试,单元测试中的单元在Android或Java中可以理解为某个类中的某一个方法,因此单元测试就是针对Android或Java中某个类中的某一个方法中的逻辑代码进 ...
- 收藏 —— 教你阅读Python开源项目
https://zhuanlan.zhihu.com/p/22275595?refer=python-cn
- 10 dict嵌套与升级
dic = { 'name':['alex','wusir','taibai'], 'py9':{ ', 'learm_money':19800, 'addr':'CBD', }, 'age':21 ...
- 转:解决AndroidStudio连不上Android设备真机的问题
Android手机开发Android应用的时候,需要连接真机,进行应用软件的真机调试,但是由于诸多原因,可能导致无法与实现连接: 在我们连接了Android设备出现上面这种情况的时候,可以打开设备管理 ...
- ionic+cordova填坑
1.命令行更新 cordova,ionic.nodejs ,npm,bower等到新版本,不要在vs中更新 2.程序突然白屏 因为拷贝其他程序到js中,乱码 :a模拟器打开 f12看控制台错误解决 3 ...
- MQTT协议
MQTT(Message Queue Telemerty Transport)是一种二进制协议,主要用于服务器和那些低功耗的物联网设备(IoT)之间的通信. 它位于 TCP 协议的上层,除了提供发布- ...
- azkaban 配置邮件
1.配置邮件请在azkaban-web-server中进行配置:如下图: /opt/azkaban/azkaban/azkaban-web-server/build/install/azka ...