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){})监听。

  注意:要把所有的数据传递放到,监听函数中。

 

posted @ 2016-03-09 17:50  走向未知  阅读(6764)  评论(0编辑  收藏  举报