`

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>



效果:





内附源码
  • 大小: 43.2 KB
1
0
分享到:
评论

相关推荐

    AngularJS封装jQuery Datepicker

    **AngularJS 封装 jQuery Datepicker 知识点详解** 在Web开发中,日期选择器是一个常见的组件,用于用户输入日期或选择日期范围。AngularJS 和 jQuery 的结合使用可以为开发者提供更强大的功能和更好的用户体验。这...

    AngularJS封装jQuery DateTimepicker

    AngularJS 是一个强大的前端JavaScript框架,它用于构建动态web应用。而jQuery DateTimepicker是一个插件,通常用于在网页上提供日期和时间选择功能,它使得用户界面更加友好且易于操作。这篇博客“AngularJS封装...

    AngularJS封装jQuery-File-Upload

    总的来说,"AngularJS封装jQuery-File-Upload"这个主题涵盖了AngularJS的指令和服务创建,以及如何在AngularJS和jQuery插件之间建立桥梁,实现数据绑定和事件处理。这不仅有助于理解AngularJS的内部工作原理,也有助...

    angularjs实现上传图片并且预览

    在本文中,我们将深入探讨如何使用AngularJS框架来实现图片上传和预览功能。AngularJS,作为一款强大的前端JavaScript框架,提供了丰富的功能和模块化设计,使得开发动态Web应用变得更加简单。图片上传和预览是现代...

    基于angularjs 自己封装的的验证插件

    本插件就是这样一个解决方案,它允许开发者封装自己的验证逻辑,提供灵活且强大的验证功能。 AngularJS是一个由Google维护的JavaScript MVC(模型-视图-控制器)框架,主要用于构建单页应用(SPA)。其核心特性之一...

    webapi+AngularJs上传附件

    在本文中,我们将深入探讨如何使用WebAPI和AngularJS实现一个无插件的附件上传功能。WebAPI是ASP.NET框架的一部分,主要用于构建RESTful服务,而AngularJS则是一个强大的前端JavaScript框架,用于构建动态单页应用...

    Angularjs Maintaining Web Applications.pdf

    - **服务(Services)**:服务是AngularJS中用于封装业务逻辑的方式。AngularJS支持多种方式创建服务,如使用factory、service和provider。 - **内置服务**:AngularJS内置了很多服务来帮助开发者处理常见任务,...

    AngularJS封装$http.post()实例详解

    用了不是很长的时间跟了一个移动APP项目,用的是ionic + AngularJS + cordova框架,其间遇到过挺多问题,其中一个就是对Ajax的封装问题。 其实针对封装问题一直以来就没停止过谈论,不同的项目也有不同的需求,举...

    webupload demo webuploader实例

    这个"webupload demo webuploader实例"的压缩包很可能是为了展示如何在实际项目中使用WebUploader进行文件上传操作。下面,我们将深入探讨WebUploader的核心功能、工作原理以及如何通过示例来实现文件上传。 1. ...

    AngularJS封装指令方法详解

    在组件封装操作技巧方面,需要使用到AngularJS的依赖注入和封装设计模式,将组件逻辑从DOM操作中分离出来,实现高度模块化和可维护性。在封装指令时,应该遵循单一职责原则,一个指令只做一件事。指令的创建可以通过...

    封装系统,自动删除c:\drivers文件夹

    封装系统,自动删除c:\drivers文件夹.可将此文件放在除SYSPREP文件夹以外的任何地方,在封装工具中首次进系统运行此文件,就能删除c:\drivers文件夹,完成后自动删除自身,所以不用再进行删除此文件的步骤.

    uploadfile_大文件上传_springboot_webupload_源码

    本项目"uploadfile_大文件上传_springboot_webupload_源码"旨在演示如何结合WebUpload和Spring Boot实现高效的大文件上传功能。 首先,我们要理解Spring Boot中的MultipartFile接口。这是Spring MVC框架为处理上传...

    ngECharts:ECharts的AngularJS封装包

    Baidu ECharts() 的AngularJS封装包。 说明: 本插件受 启发,本着学习AngularJS而写; 封装了echarts的showLoading, hideLoading, connect和添加自定义地图的方法; 其他Baidu ECharts的AngularJS插件,以供参考...

    angularjs自定义select搜索查找插件

    AngularJS是一个流行的JavaScript框架,它提供了强大的数据绑定和依赖注入机制,使得构建动态Web应用变得更为简单。自定义Select组件在实际开发中非常常见,因为它可以提供更丰富的交互性和用户体验。 首先,让我们...

    delphi 实现文件夹内容监控

    本主题聚焦于如何利用Delphi实现文件夹内容的监控功能。文件夹内容监控是系统编程中的一个重要方面,它允许开发者跟踪指定目录下的文件变动,如新建、删除或修改,这对于日志记录、数据备份、版本控制等应用场景非常...

    angularJs demo 各种基本用法

    AngularJS 是一个强大的JavaScript框架,主要用于构建动态web应用。它通过数据绑定和依赖注入机制,极大地简化了前端开发。在"angularJs demo 各种基本用法"中,我们可以深入探讨以下几个关键概念:路由(router)、...

    angularjs 文件上传

    在本文中,我们将深入探讨如何使用AngularJS进行文件上传,这是一种强大的前端JavaScript框架,它提供了构建动态Web应用程序所需的各种功能。由于我们不依赖任何第三方插件,因此这种方法保证了更好的兼容性和更少的...

    Upload JS 上传附件+Demo示例

    综上所述,"Upload JS 上传附件+Demo示例"是一个关于如何使用JavaScript自定义封装上传附件功能的资源,包括核心的上传逻辑、封装方法和实际操作示例,对于希望实现Web应用中文件上传功能的开发者来说具有很高的参考...

Global site tag (gtag.js) - Google Analytics