JavaScript File分段上传
HTML
<formmethod="POST"name="form"action="/mupload/upload/"enctype="multipart/form-data"> <inputtype='hidden'name='csrfmiddlewaretoken'value=''/> <inputid='file'type='file'name='file'onchange=""/> <inputid='button'name='submit'type='button'value="上传"onclick="chunk_upload(this)"/> </form>
js方法
varfileSplitSize=1024*1024;
varstart=0,end=0;
vari=0;
//文件段上传
functionchunk_upload(button){
varxmlhttp=newXMLHttpRequest();
xmlhttp.open("POST","/chunk_upload/upload/",false);
xmlhttp.setRequestHeader("X-CSRFToken",button.form['csrfmiddlewaretoken'].value);
varf=button.form;
varfile=f['file']['files'][0];
varsize=file.size;
end=start+fileSplitSize;
if(end>size){
i=-1;
end=size;
}else{
i+=1;
end=end;
}<br>//按大小切割文件段
varblob=file.slice(start,end);
xmlhttp.setRequestHeader('charset','utf-8');
xmlhttp.setRequestHeader("fileMD5",fileMD5);
xmlhttp.setRequestHeader("start",start);
xmlhttp.setRequestHeader("end",end);
xmlhttp.send(blob);
if(xmlhttp.status==200){<br>if(end==size){<br>varbacktext=xmlhttp.responseText;<br>alert(backtext);<br>}else{<br>alert("上传完成第"+i+"段")<br>start=end;<br>chunk_upload(button);<br>}<br>}else{<br>alert("上传错误");<br>chunk_upload(button);<br>}
}
主要思想:
注意设置切割的起始位置和切割大小,通过XMLHttpRequest的发送请求(http协议要知道)。
如果一些标记数据可以添加协议头:xmlhttp.setRequestHeader("end",end);
发送协议体xmlhttp.send(data);
监听返回码来判断是否传递成功,在进行下一步操作。
重新设置切割位置,然后递归调用自身start=end;chunk_upload(button);
注意:
切割的start与end和filesize的关系
纯js异步上传文件,并返回上传进度
纯js实现异步上传文件,异步返回文件上传进度,0.05到0.1秒回调一次上传进度,其它详细见代码片段下用法注释
1.简单的异步上传函数
;(function(window,document){
varmyUpload=function(option){
varfile,
fd=newFormData(),
xhr=newXMLHttpRequest(),
loaded,tot,per,uploadUrl,input;
input=document.createElement("input");
input.setAttribute('id',"myUpload-input");
input.setAttribute('type',"file");
input.setAttribute('name',"files");
input.click();
uploadUrl=option.uploadUrl;
callback=option.callback;
uploading=option.uploading;
beforeSend=option.beforeSend;
input.onchange=function(){
file=input.files[0];
if(beforeSendinstanceofFunction){
if(beforeSend(file)===false){
returnfalse;
}
}
fd.append("files",file);
xhr.onreadystatechange=function(){
if(xhr.readyState==4&&xhr.status==200){
if(callbackinstanceofFunction){
callback(xhr.responseText);
}
}
}
//侦查当前附件上传情况
xhr.upload.onprogress=function(evt){
loaded=evt.loaded;
tot=evt.total;
per=Math.floor(100*loaded/tot);//已经上传的百分比
if(uploadinginstanceofFunction){
uploading(per);
}
};
xhr.open("post",uploadUrl);
xhr.send(fd);
}
};
window.myUpload=myUpload;
})(window,document);
//用法
//触发文件上传事件
myUpload({
//上传文件接收地址
uploadUrl:"/async/myUpload.php",
//选择文件后,发送文件前自定义事件
//file为上传的文件信息,可在此处做文件检测、初始化进度条等动作
beforeSend:function(file){
},
//文件上传完成后回调函数
//res为文件上传信息
callback:function(res){
},
//返回上传过程中包括上传进度的相关信息
//详细请看res,可在此加入进度条相关代码
uploading:function(res){
}
});