`
dreamoftch
  • 浏览: 496706 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

断点上传中的javascript代码

阅读更多
//项目路径,例如:"/upload"
var contextPath ;
//显示速度百分比文件名的元素id
var ratePercent_id;
//是否已经上传完成
var isUploadComplete = 'false';
//查询上传速度百分比的时间间隔(值越小,频率越大)
var getRateInterval = 3000;
//页面经过多久之后去检验本地是否安装了客户端
var checkIsInstall_time_delay = 2000;
//文件上传成功之后,接收文件和参数信息的url
var _callbackURL;
//客户端获取授权的url
var getAuthorityURL;
//去查询用户选择的文件路径的定时器的时间间隔
var getFilePathInterval = 1000;
//将文件路径信息保存到服务器时的key
var key = Date.parse(new Date())+'-'+Math.random();
//获取上传服务器信息URL:
var _URL4UploadServerInfo;
//getAuthority的相应
var getAuthorityResponse;
var isShowRateLocal;
/**
 * 初始化服务器名称以及上传连接、速度百分比、文件名元素的id
 * @param {Object} path服务器名称
 * @param {Object} linkId上传连接
 * @param {Object} rateId速度
 * @param {Object} fileNameId文件名
 * @param {Object} percentId百分比
 */
function initContextPathAndIds(URL4UploadServerInfo,callbackURL,ratePercentId){
	if(! URL4UploadServerInfo){
		alert('请设置URL4UploadServerInfo的值');
	}
	if(! callbackURL){
		alert('请设置callbackURL的值');
	}
	_URL4UploadServerInfo = URL4UploadServerInfo;
	_callbackURL = callbackURL;
	if(ratePercentId){
		ratePercent_id = ratePercentId;
	}
	loadComplete();
}

/**
 * 遍历form中的所有元素,并生成对应的参数字符串
 */
function findAllFormElements(){
	var params = '';
	var element;
	//遍历input type=text元素(且有name属性)
	$("input:text[name]").each(function(){
		element = $(this);
		//如果没有value则返回
		if(! element.val()){
			return;
		}
		//说明不是第一个
		if(params){
			params += '&'+element.attr('name')+'='+element.val();
		//说明是第一个
		}else{
			params += element.attr('name')+'='+element.val();
		}
	});
	//遍历input type=password元素(且有name属性)
	$("input:password[name]").each(function(){
		element = $(this);
		//如果没有value则返回
		if(! element.val()){
			return;
		}
		//说明不是第一个
		if(params){
			params += '&'+element.attr('name')+'='+element.val();
		//说明是第一个
		}else{
			params += element.attr('name')+'='+element.val();
		}
	});
	//遍历input type=hidden元素(且有name属性)
	$("input[type='hidden'][name]").each(function(){
		element = $(this);
		//如果没有value则返回
		if(! element.val()){
			return;
		}
		//说明不是第一个
		if(params){
			params += '&'+element.attr('name')+'='+element.val();
		//说明是第一个
		}else{
			params += element.attr('name')+'='+element.val();
		}
	});
	//遍历input type=radio元素(且有name属性)
	$("input:radio[name]:checked").each(function(){
		element = $(this);
		//如果没有value则返回
		if(! element.val()){
			return;
		}
		//说明不是第一个
		if(params){
			params += '&'+element.attr('name')+'='+element.val();
		//说明是第一个
		}else{
			params += element.attr('name')+'='+element.val();
		}
	});
	//遍历input type=checkbox元素(且有name属性)
	$("input:checkbox[name]:checked").each(function(){
		element = $(this);
		//如果没有value则返回
		if(! element.val()){
			return;
		}
		//说明不是第一个
		if(params){
			params += '&'+element.attr('name')+'='+element.val();
		//说明是第一个
		}else{
			params += element.attr('name')+'='+element.val();
		}
	});
	//遍历select option元素(且有name属性)
	$("select[name] option:selected").each(function(){
		element = $(this);
		//如果没有value则返回
		if(! element.val()){
			return;
		}
		if(! element.parent("[name]")){
			return;
		}
		//说明不是第一个
		if(params){
			params += '&'+element.parent("[name]").attr('name')+'='+element.val();
		//说明是第一个
		}else{
			params += element.attr('name')+'='+element.val();
		}
	});
	return params;
}
var getFilePathTimeout;
/**
 * 初始化
 */
function loadComplete(){
	var file;
	if(! key){
		key = Date.parse(new Date())+'-'+Math.random();
	}
	$("input:file").each(function(i){
		file = $(this);
		file.bind('click',function(){
			try{
				//绑定事件,点击之后弹出文件选择框
				if(! file.attr("id")){
					alert('您尚未对file元素设定id');
					return false;
				}
				//先等待1000ms,让客户端有时间去向服务器发送请求,确保IsInstall的值被设置
				setTimeout("checkIsInstall()",checkIsInstall_time_delay);
				//调用客户端弹出文件选择框
				window.location = 'Luban://local_do=fileupload&choosefile=true&key='+key+"&contextPath="+ contextPath+"&id="+file.attr("id");
				if(getFilePathTimeout){
					clearTimeout(getFilePathTimeout);
				}
				//从点击file开始,过500ms开始去查询文件路径
				getFilePathTimeout = setTimeout("getFilePathFromServer()",500);
			}catch(e){}
			return false;
		});
	});
	//向_URL4UploadServerInfo地址发送get请求,并解析返回结果
	$.get(_URL4UploadServerInfo,function(data){
		if(data){
			//响应格式:uploadServerDomain=http://u.myluban.com&&URL4ApplyUploadAuth=http://www.google.com/applyUploadAuth4LubanAdmin
			contextPath = data.split('&&')[0].split('=')[1];
			getAuthorityURL = data.split('&&')[1].split('=')[1];
		}
	},"text");
}

/**
 * 获取授权信息
 */
function getAuthority(getAuthorityURL,href){
	$.get(getAuthorityURL,function(data){
		if(data){
			//响应格式:authSource=鲁班运维后台&&auth2User=刘夕波&&auth2UserType=2&&fileUpload2URL=http://u.myluban.com/fileupload&&
			//						authGenerateTime=1370422339758&&authExpiredTimeLen=30000&&sign=md5
			//由于客户端解析参数的时候会按照&拆分,所以把&&替换为##
			getAuthorityResponse = data.replace(/&&/g,'##');
			//将href保存到服务器
			sendHrefToServer(href);
		}
	},"text");
}
/**
 * 从服务器查询用户选择的文件的路径,显示在页面中
 */
function getFilePathFromServer(){
	var url = contextPath+'/lubanFileUpload/getFilePath';
	if(! key){
		key = Date.parse(new Date())+'-'+Math.random();
	}
	var param = {'key':key};
	//先将参数发送到服务器,发送成功之后再启动定时器检查本地是否安装了客户端
	$.post(url,param,function(data){
		if(data){
			//将data转为json格式
			data = eval("("+data+")");
			//点击了取消,没有选择文件
			if("cancel" == data.status){
				if(getFilePathTimeout){
					clearTimeout(getFilePathTimeout);
				}
				return;
			//点击了确认,选择了文件,要显示路径
			}else if("confirm" == data.status){
//				createAndShowFloatDiv(data.id,data.filePath);
				//alert(data.filePath);
				if(getFilePathTimeout){
					clearTimeout(getFilePathTimeout);
				}
				return;
			}
		}
		//说明还没有查询到结果,继续查询
		if(getFilePathTimeout){
			clearTimeout(getFilePathTimeout);
		}
		getFilePathTimeout = setTimeout("getFilePathFromServer()",getFilePathInterval);
	},"text");
}
/**
 * 创建并显示浮动层
 */
function createAndShowFloatDiv(id,filePath){
	var width = $("#"+id).width()*0.75;
	var height= $("#"+id).height();
	var top = $("#"+id).offset().top;
	var left =  $("#"+id).offset().left;
}
/**
 * 将上传参数保存到服务器
 */
function upload(){
	//格式为:uploadhelper://fileName=aaa.txt&fileName=bbb.txt&param=p1&param=p2
	var href = '';
	//循环所以的file,将其文件路径添加到链接后面
	if(isShowRateLocal){
		href += "isShowRateLocal=true";
	}
	if(_callbackURL){
		if(href){
			href += ("&callbackURL="+_callbackURL);
		}else{
			href += ("callbackURL="+_callbackURL);
		}
	}
	var param = findAllFormElements();
	if(param){
		if(href){
			href += ("&"+param);
		}else{
			href += (param);
		}
	}
	getAuthority(getAuthorityURL,href);
}

//定义一个定时器去显示下载速度和百分比
var getUploadRateTimeout ;

/**
 * 先判断本地是否安装了客户端,然后再查询上传速度百分比
 */
function confirmUpload(){
	upload();
	return false;
}
/**
 * 判断本地是否安装了客户端,然后再查询上传速度百分比
 */
function checkIsInstall(isUploadOrNot){
	var url = contextPath+'/lubanFileUpload/getIsInstall?key='+key;
	$.get(url,function(data){
		if(data != 'true'){
			var result = confirm('如果您还没有安装客户端程序,请点击确定下载客户端,下载之后双击程序进行注册表注册,如果您已经下载过客户端,' +
								'请选择取消,并重新双击该程序进行注册,注意:请不要将客户端存放在含有中文的目录下');
			if(result){
				window.location = contextPath+"/lubanFileUpload/downloadClient";
			}
		}
		//如果是点击的选择文件,则只需要调用客户端弹出文件选择框即可,不需要查询上传速度
		//如果是点击的上传文件,则需要查询上传速度
		if(isUploadOrNot){
			if(getUploadRateTimeout){
				clearTimeout(getUploadRateTimeout);
			}
			getUploadRateTimeout = setTimeout("getUploadRate()",0);
		}
	},"text");
}
/**
 *手动显示速度 
 */
 function showRate_manual(){
	if(getUploadRateTimeout){
		clearTimeout(getUploadRateTimeout);
	}
	getUploadRateTimeout = setTimeout("getUploadRate()",0);
 }
/**
 * 将上传参数保存到服务器
 */
function sendHrefToServer(href){
	if(! getAuthorityResponse){
		alert("尚未获取授权信息");
		//没有获取授权的Url地址,则无法获取授权
		return;
	}
	if(! contextPath){
		alert("尚未获取上传服务器信息");
		//没有获取contextPath地址
		return;
	}
	//添加上获取授权的url地址
	href += ("&getAuthorityResponse="+getAuthorityResponse);
	href = "Luban://"+encodeURI(encodeURI(href));
	var url = contextPath+'/lubanFileUpload/setHrefValue';
	if(! key){
		key = Date.parse(new Date())+'-'+Math.random();
	}
	var param = {'href':href,'key':key};
	//先将参数发送到服务器,发送成功之后再启动定时器检查本地是否安装了客户端
	$.post(url,param,function(){
		//先等待1000ms,让客户端有时间去向服务器发送请求,确保IsInstall的值被设置
		setTimeout("checkIsInstall('upload')",checkIsInstall_time_delay);
		window.location = "Luban://getArgumentsFromServer=true&local_do=fileupload&contextPath="+ contextPath +"&key="+key;
	},"text");
}
/**
 * 通过ajax查询上传速度和百分比
 */ 
function getUploadRate(){
	//首先检查显示速度信息的id是否存在,不存在的话就不需要查询速度信息
	if(! ratePercent_id){
		//如果ratePercent_id不存在,则认为不需要查询和显示速度百分比信息
		if(getUploadRateTimeout){
			//如果有查询速度百分比的定时器,则取消该定时器
			clearTimeout(getUploadRateTimeout);
		}
		return;
	}
	if(key){
		var url = contextPath+'/lubanFileUpload/getUploadRateAndPercent?time='+Date.parse(new Date())+"&key="+key;
	$.get(url,function(data){
		showRate(data);
	},"text");
	}
}
/**
 * 显示速度和百分比
 */
function showRate(data){
	if(data){
		var result = eval("("+data+")");
		$("#"+ratePercent_id).html('文件名:'+result.fileName+'<br/>'+'上传速度:'+result.rate+' kb/s'+'<br/>'+'上传百分比:'+result.percent+' %');
		if(result.isCompleted == 'true'){
			if(getUploadRateTimeout){
				clearTimeout(getUploadRateTimeout);
			}
			isUploadComplete = 'true';
			//执行上传完成的操作
			fileUploadComplete();
			//刷新
			window.location = window.location;
		}else if(result.isCompleted == 'interrupt'){
			if(getUploadRateTimeout){
				clearTimeout(getUploadRateTimeout);
			}
			isUploadComplete = 'break';
			//执行上传中断的操作
			fileUploadInterrupted();
			//刷新
			window.location = window.location;
		}else{
			if(getUploadRateTimeout){
				clearTimeout(getUploadRateTimeout);
			}
			getUploadRateTimeout = setTimeout("getUploadRate()",getRateInterval);
		}
	}else{
		if(getUploadRateTimeout){
				clearTimeout(getUploadRateTimeout);
			}
		getUploadRateTimeout = setTimeout("getUploadRate()",getRateInterval);
	}
}
function fileUploadComplete(){}
function fileUploadInterrupted(){}
/**
 * 获得页面的JSESSIONID
 * @return {TypeName} 
 */
function getSessionId(){
	var c_name = 'JSESSIONID';
	if(document.cookie.length>0){
	   c_start=document.cookie.indexOf(c_name + "=");
	   if(c_start!=-1){ 
	     c_start=c_start + c_name.length+1 ;
	     c_end=document.cookie.indexOf(";",c_start);
	     if(c_end==-1) c_end=document.cookie.length;
	     return unescape(document.cookie.substring(c_start,c_end));
	   }
	}
}

 

分享到:
评论

相关推荐

    文件的断点上传struts2

    这个模块可能包括Action类、配置文件、前端界面代码等组件,帮助开发者快速集成断点上传功能到Struts2应用中。 总之,实现Struts2的断点上传需要对文件上传流程进行深入理解和定制,涉及文件分块、服务器存储、...

    文件断点上传,支持大文件

    文件断点上传,顾名思义,允许用户在文件上传过程中中断并稍后从中断的位置继续上传,而不需要重新开始整个过程。这种技术在上传大文件时非常有用,因为网络连接不稳定或者用户意外中断上传时,可以避免大量的数据...

    断点续传前端代码实现.zip

    在IT行业中,断点续传是一项非常实用的技术,特别是在大文件传输时,它允许用户中断上传或下载过程并在稍后从上次停止的地方继续,而无需重新开始。此压缩包"断点续传前端代码实现.zip"包含了一套完整的前端解决方案...

    springboot+vue 大文件上传 包括断点续传 秒传 分片上传.zip

    断点续传是大文件上传中的关键特性,它允许用户在上传过程中中断后继续从断点位置开始上传。在本项目中,后端需要存储每个文件的已上传部分信息,如上传的分片列表和每个分片的校验值。前端则负责保存上传状态,当...

    Asp.net编写的上传功能代码,能支持动态上传.显示进度条和断点续传

    在C#代码中,可能会用到System.IO.Stream和System.IO.FileStream类来读取和写入文件,System.Web.HttpPostedFileBase接口来处理上传的文件。此外,使用Session或Application对象可以跟踪用户上传的状态。对于断点续...

    jquery-大文件上传插件,支持分片上传,断点续传

    2. **断点续传**:如果上传过程中因网络问题中断,传统方式通常需要从头开始重新上传。但这个插件支持断点续传功能,意味着用户可以在上次中断的地方继续上传,节省了大量时间和带宽。 3. **自定义参数**:开发者...

    基于vue+elementui实现断点续传、分片上传、秒传.zip

    在现代Web应用开发中,文件上传是一个常见的功能需求,尤其对于大文件的处理,断点续传、分片上传和秒传技术变得尤为重要。本文将详细介绍如何使用Vue.js框架结合Element UI库来实现这些高级上传功能。 Vue.js是...

    断点续传后端代码.zip

    WebUploader是由百度开发的一个JavaScript文件上传组件,它提供了丰富的前端功能,包括多文件选择、预览、进度显示以及断点续传等。而这里的"断点续传后端代码.zip"则包含了支持这些功能的服务器端代码,确保了整个...

    javascript特效代码(最新)

    本文将详细解析"javascript特效代码(最新)"中的关键知识点,包括但不限于特效实现、代码规范和最佳实践。 首先,JavaScript特效代码是网页设计中提升用户体验的关键。这些特效可能涵盖滑动面板、滚动动画、图像...

    基于minio webuploader实现的分片上传 断点续传

    而WebUploader是一款JavaScript库,主要用于前端大文件的分片上传和断点续传,提高了上传效率和用户体验。本项目将这两个技术结合,实现了基于MinIO的WebUploader分片上传与断点续传功能。 1. MinIO对象存储服务: ...

    大文件不分块断点上传

    "WebUploadTest"可能是实现这一功能的测试项目或示例代码,可以帮助我们更好地理解和实践大文件不分块断点上传的逻辑。 综上所述,大文件不分块断点上传是通过结合客户端和服务器端的智能处理,以确保大文件上传的...

    php+html5实现无刷新上传,大文件分片上传,断点续传

    在提供的压缩包文件中,`index.html`应该是前端的上传界面,可能包含HTML5的文件输入元素和JavaScript代码来处理文件选择和上传逻辑。`upload.php`是PHP处理文件上传的脚本,它需要解析和存储前端发送的分片。`...

    silverlight 断点上传

    断点上传是一种网络文件上传技术,它允许用户在文件上传过程中中断并稍后从停止的地方继续,而不是重新开始整个上传过程。在ASP.NET环境中,Silverlight作为一种强大的RIA(Rich Internet Application)开发工具,常...

    netty4.0文件分片上传+断点续传+权限校验

    在本文中,我们将深入探讨如何利用Netty 4.0实现文件分片上传、断点续传以及权限校验的功能。 **文件分片上传** 文件分片上传是为了处理大文件传输时,避免一次性加载整个文件到内存中,从而减少内存消耗和提高...

    上传文件代码源码 网页上传源码

    在IT行业中,网页上传功能是网站交互的重要组成部分,它允许用户将本地的文件上传到服务器,以便进行数据存储、分享或者其他交互操作。本资源提供的"上传文件代码源码"是实现这一功能的具体实现,适用于开发者学习和...

    支持断点续传的上传组件FileUpload

    在本文中,我们将深入探讨支持断点续传的上传组件——FileUpload,以及如何利用它来实现高效、可靠的文件上传。 FileUpload组件是专为.NET平台设计的,它集成了ASP.NET框架,能够提供服务器端的稳定支持。通过这个...

    java+vue断点续传核心代码

    - `js`:前端的JavaScript代码,实现Vue.js应用的逻辑,包括文件选择、分块、上传和断点续传功能。 - `dto`:数据传输对象(Data Transfer Object),在Java和Vue.js之间交换数据的模型类。 通过这些核心代码,我们...

    KUploader(断点上传源码)

    **KUploader(断点上传源码)详解** KUploader是一款强大的前端文件上传组件,它支持多文件选择、断点续传、大文件分片上传、进度显示等功能,广泛应用于网页中的文件上传场景。这款组件的核心特性是断点续传,即在上...

    修改plupload,上传文件,支持断点,可上传超过2G

    标题 "修改plupload,上传文件,支持断点,可上传超过2G" 指向的是一个关于增强开源JavaScript文件上传组件plupload的功能,使其具备断点续传和处理大文件(超过2GB)的能力。plupload是一款强大的多浏览器、多后端...

    javaweb实际项目开发中上传文件图片的实现(代码)

    - 大文件上传可能需要考虑分片上传、断点续传,以提高上传效率和用户体验。 总的来说,JavaWeb实现文件图片上传涉及到后端处理、前端交互、存储策略、安全性等多个方面。理解并熟练运用上述知识点,能帮助开发者...

Global site tag (gtag.js) - Google Analytics