Home > Article > Web Front-end > JavaScript File multipart upload_javascript tips
HTML
<form method="POST" name="form" action="/mupload/upload/" enctype="multipart/form-data"> <input type='hidden' name='csrfmiddlewaretoken' value='' /> <input id='file' type='file' name='file' onchange="" /> <input id='button' name='submit' type='button' value="上传" onclick="chunk_upload(this)"/> </form>
js method
var fileSplitSize = 1024 * 1024; var start=0,end=0; var i=0; // 文件段上传 function chunk_upload(button){ var xmlhttp = new XMLHttpRequest(); xmlhttp.open("POST", "/chunk_upload/upload/", false); xmlhttp.setRequestHeader("X-CSRFToken", button.form['csrfmiddlewaretoken'].value); var f = button.form; var file = f['file']['files'][0]; var size=file.size; end=start+fileSplitSize; if(end>size){ i=-1; end=size; }else{ i+=1; end=end; }<br> //按大小切割文件段 var blob = 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> var backtext=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> } }
Main idea:
Pay attention to setting the starting position and cutting size of the cutting, and send the request through XMLHttpRequest (you need to know the http protocol).
If you have some markup data, you can add a protocol header: xmlhttp.setRequestHeader("end", end);
Send protocol body xmlhttp.send(data);
Monitor the return code to determine whether the transfer is successful and proceed to the next step.
Reset the cutting position and then recursively call itself start=end;chunk_upload(button);
Note:
The relationship between cutting start, end and filesize
Pure js asynchronously uploads files and returns the upload progress
Pure JS implements asynchronous file upload, returns the file upload progress asynchronously, and calls back the upload progress once every 0.05 to 0.1 seconds. For other details, please see the usage notes under the code snippet
1. Simple asynchronous upload function
;(function(window,document){ var myUpload = function(option) { var file, fd = new FormData(), xhr = new XMLHttpRequest(), 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(beforeSend instanceof Function){ if(beforeSend(file) === false){ return false; } } fd.append("files", file); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { if(callback instanceof Function){ callback(xhr.responseText); } } } //侦查当前附件上传情况 xhr.upload.onprogress = function(evt) { loaded = evt.loaded; tot = evt.total; per = Math.floor(100 * loaded / tot); //已经上传的百分比 if(uploading instanceof Function){ 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) { } });