JS分段上传文件(File)并使用MD5.js加密文件段用来后台校验

时间:2023-03-09 04:56:52
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){})监听。

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