$("#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,objectName,uploadId);
//合并
combineFile(objectName,uploadId);
},error:function (){
alert("系统出现异常!");
flag=false;
}
});
});
//执行分片上传
function PostFile(file,i,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,uploadId);
} else if (data.data.code == 502) {
form = '';
/* 失败后,每2秒继续传一次分片文件 */
setInterval(function () { PostFile(file,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",contentType:"application/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;
}
});
}
总结
以上是编程之家为你收集整理的ajax异步实现文件分片上传全部内容,希望文章能够帮你解决ajax异步实现文件分片上传所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。