ajax异步实现文件分片上传

  • A+
所属分类:Web前端
摘要

转载于:https://blog.csdn.net/likun1239656678/article/details/109432560?utm_medium=distribute.pc_category.none-task-blog-hot-13.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-13.nonecase

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>JS分片上传-极速上传</title> </head> <body>     <input type="file" name="slice" id="slice" >        <div id="output"><!--  信息存放地  --> </div> <br/> </body> <script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>  <script type="text/javascript">     $("#slice").change(function(event) {         var file = $("#slice")[0].files[0]; 		var name = file.name; 				//进行初始化 				$.ajax({   		                type:"POST", //请求方式  		                url:"http://localhost:8080/getuploadId", 						async: false, 		                dataType:"json", //返回数据类型 		                data:{//请求参数 		               		fileName:name, 		                }, 		                success:function(data){ //请求成功后		                	 		                	console.log("data.code="+JSON.stringify(data)); 							console.log("data.data.objectName="+data.data.objectName); 							console.log("data.data.uploadId="+data.data.uploadId);		 							var objectName=data.data.objectName; 							var uploadId=data.data.uploadId; 							//成功后执行分段上传 							PostFile(file,0,objectName,uploadId); 							//合并 							combineFile(objectName,uploadId); 							 							 						 }, 		                error:function (){ 		                	alert("系统出现异常!"); 		                	flag=false; 		                }     					});  		              });     //执行分片上传     function PostFile(file,i,objectName,uploadId){         var name = file.name,                           //文件名             size = file.size,                           //总大小shardSize = 2 * 1024 * 1024,             shardSize = 1 * 1024 * 1024,                //以2MB为一个分片,每个分片的大小             shardCount = Math.ceil(size / shardSize);   //总片数         if(i >= shardCount){             return;         }         //console.log(size,i+1,shardSize);  //文件总大小,第一次,分片大小//         var start = i * shardSize;         var end = start + shardSize;         var packet = file.slice(start, end);  //将文件进行切片 		// 分段号 		var partNumber = i + 1;         /*  构建form表单进行提交  */         var form = new FormData();         form.append("fileId", '001')         form.append("data", packet); //slice方法用于切出文件的一部分 //         form.append("lastModified", file.lastModified); //最后的额修改时间         form.append("name", name);         form.append("totalSize", size); 		 		form.append("uploadId", uploadId); 		form.append("objectName", objectName); 		form.append("mainFile", packet); 		form.append("total", shardCount); 		form.append("sortNumber", partNumber); 		 		//uploadId:uploadId, 		//objectName:objectName, 		//mainFile:blob, 		//total:partCount, 		//sortNumber:partNumber 		         if(shardCount === i+1){             shardSize = size - i * shardSize         }         form.append("shardSize", shardSize);         form.append("total", shardCount); //总片数         form.append("index", i + 1); //当前是第几片         $.ajax({           //  header: {           //      web_token: "cpBvqWrr0UK9zPJoKj+412alxxcY6qFwrSVoO0juZg0S1jX/sGfMd9oi3AsSxW+MdWFrwtGCykUTmMqrqpbCElmT75DfB87lENC7lCuMxgF0d5wQB6yAubUVyGOzhbrScvIfD8ZSjOJ3D88AOy2xRd4oG8TxeGoMoZqnqIwjKg="           //  },             url: "http://localhost:8080/multipartupload",             type: "POST",             data: form,             //timeout:"10000",  //超时10秒             async: false, //同步             dataType:"json",             processData: false, //很重要,告诉jquery不要对form进行处理             contentType: false, //很重要,指定为false才能形成正确的Content-Type             success: function (data) {                 console.log("data="+JSON.stringify(data));                 /*  表示上一块文件上传成功,继续下一次  */                 if (data.data.code == 1) {                     form = '';                     i++;                     PostFile(file, i,objectName,uploadId);                 } else if (data.data.code == 502) {                     form = '';                     /*  失败后,每2秒继续传一次分片文件  */                     setInterval(function () { PostFile(file, i,objectName,uploadId) }, 2000);                 } else if (data.data.code == 200) {                     console.log("上传成功");                 } else if (data.data.code == 500) {                     console.log('第'+msg.i+'次,上传文件有误!');                 } else {                     console.log('未知错误');                 }             }         })     } 	//合并 	function combineFile(objectName,uploadId){ 			console.log("objectName="+objectName); 			console.log("uploadId="+uploadId); 			var object=new Object(); 			object.objectName=objectName; 			object.uploadId=uploadId; 			 $.ajax({   				                         headers: { 						Accept: "application/json; charset=utf-8" 				}, 					type:"POST", //请求方式  					url:"http://localhost:8080/combine", 					async: false, 					contentType:"application/json", 					dataType:"json", //返回数据类型 					data:JSON.stringify(object), 					success:function(data){ //请求成功后		                	 						console.log("data="+JSON.stringify(data)); 						console.log("data.data.code="+data.data.code); 						console.log("data.data.url="+data.data.url);		 					}, 					error:function (){ 						alert("系统出现异常!"); 						flag=false; 					}     				}); 					 	 	 	} 	 </script> </html>

转载于:https://blog.csdn.net/likun1239656678/article/details/109432560?utm_medium=distribute.pc_category.none-task-blog-hot-13.nonecase&depth_1-utm_source=distribute.pc_category.none-task-blog-hot-13.nonecase