HTMLjavascript
<form method="POST" name="form1" 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方法html
<script src="/static/newupload/md5.js"></script>java
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; }
//按大小切割文件段 var data= file.slice(start, end); var r=new FileReader();
r.readAsBinaryString(data);
$(r).load(function(e){
var bolb=e.target.result;
var check=hex_md5(bolb); xmlhttp.setRequestHeader('charset','utf-8'); xmlhttp.setRequestHeader("fileMD5", fileMD5);
xmlhttp.setRequestHeader("check", check); xmlhttp.setRequestHeader("start", start); xmlhttp.setRequestHeader("end", end); xmlhttp.send(data); if(xmlhttp.status==200){
if(end==size){
var backtext=xmlhttp.responseText;
alert(backtext);
}else{
alert("上傳完成第"+i+"段")
start=end;
chunk_upload(button);
}
}else{
alert("上傳錯誤");
chunk_upload(button);
}
}) }
主要思想:函數
注意設置切割的起始位置和切割大小,經過XMLHttpRequest的發送請求(http協議要知道)。this
若是一些標記數據能夠添加協議頭:xmlhttp.setRequestHeader("end", end);加密
發送協議體xmlhttp.send(data);spa
監聽返回碼來判斷是否傳遞成功,在進行下一步操做。orm
從新設置切割位置,而後遞歸調用自身start=end;chunk_upload(button);csrf
注意:xml
切割的start與end和filesize的關係
MD5.js校驗
file.slice()方法切割出來的data是Bolb類型的,裏面雖然是二進制流,可是不能直接用MD5.js加密。
因此加密的思想就是先轉化爲能夠讀取的二進制流,使用傳統的var r=new FileReader();
r.readAsBinaryString(data);將文件轉化爲二進制流,可是fileread不管讀取失敗仍是成功都是不返回結果的,要想獲取結果就要在result中獲取,監聽是否加載成功。$(r).load(function(e){})監聽。
注意:要把全部的數據傳遞放到,監聽函數中。