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){ } });