zoukankan      html  css  js  c++  java
  • 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){})监听。

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

  • 相关阅读:
    软件测试(来自于网络)
    selenium常用命令
    新员工入门
    常用测试点
    测试leader职责
    软件测试 —— 用例设计4(读书分享)
    Tomcat 基础二
    Github Pull Request的提出与采纳
    Unix套接字接口
    健壮的I/O(RIO)
  • 原文地址:https://www.cnblogs.com/hello-word1/p/5259064.html
Copyright © 2011-2022 走看看