分段 上傳 文件 file 並使 md5.js 加密 用來 後臺 校驗 欄目 JavaScript 简体版
原文   原文鏈接

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

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

相關文章
相關標籤/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。
本站公眾號
   歡迎關注本站公眾號,獲取更多信息