HTML
<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方法
<script src="/static/newupload/md5.js"></script>
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協議要知道)。
如果一些標記數據可以添加協議頭:xmlhttp.setRequestHeader("end", end);
發送協議體xmlhttp.send(data);
監聽返回碼來判斷是否傳遞成功,在進行下一步操作。
重新設置切割位置,然后遞歸調用自身start=end;chunk_upload(button);
注意:
切割的start與end和filesize的關系
MD5.js校驗
file.slice()方法切割出來的data是Bolb類型的,里面雖然是二進制流,但是不能直接用MD5.js加密。
所以加密的思想就是先轉化為可以讀取的二進制流,使用傳統的var r=new FileReader();
r.readAsBinaryString(data);將文件轉化為二進制流,但是fileread無論讀取失敗還是成功都是不返回結果的,要想獲取結果就要在result中獲取,監聽是否加載成功。$(r).load(function(e){})監聽。
注意:要把所有的數據傳遞放到,監聽函數中。
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。