JS分段上傳文件(File)並使用MD5.js加密文件段用來后台校驗


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){})監聽。

  注意:要把所有的數據傳遞放到,監聽函數中。

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com