首页 > 其他分享 >基于JS的大文件分片

基于JS的大文件分片

时间:2023-11-24 10:32:43浏览次数:35  
标签:opt files 基于 JS file 分片 var document size

项目需要上传超大文件,后台为DJANGO,不能直接用H5 的FILE API来POST,所以采用slice分片

在分片后为BLOB不能直接传,bolb转file有些浏览器又有支持问题。所以做一些转换,转uint8,uint16,uint32,django的后台处理起来都比较烦

所以试着用base64装入json,很容易搞定。

具体思路:

1.读入文件路径

2.按固定size分片

3.给每个片段加入id,blob的内容提取成base64,json封装

4.js同步post,或者Ajax 异步post json到后台(使用队列防止浏览器卡住),

5.后台收到后拼装(注意文件锁和顺序)

 

前端代码

<!DOCTYPE html>
<head>
    <title>yyb</title>
    <script type="text/javascript" src="http://code.jquery.com/jquery-1.4.1.min.js"></script>
</head>
<style>
  #byte_content {
    margin: 5px 0;
    max-height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
  }
  #byte_range { margin-top: 5px; }
</style>


<input type="file" id="files" name="file" /> Read bytes:
<span class="readBytesButtons">
  <button>send file</button>
</span>
<div id="byte_range"></div>
<div id="byte_content"></div>
<script>
    function getCookie(name) {
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
    return cookieValue;
    }
    function csrfSafeMethod(method) {
        // these HTTP methods do not require CSRF protection
        return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
    }
</script>
<script>
  function readBlob(opt_startByte, opt_stopByte,index) {

    var files = document.getElementById('files').files;
    if (!files.length) {
      alert('Please select a file!');
      return;
    }

    var file = files[0];
    var start = parseInt(opt_startByte) || 0;
    var stop = parseInt(opt_stopByte) || file.size - 1;
    var reader = new FileReader();

    reader.onloadend = function(evt) {

      if (evt.target.readyState == FileReader.DONE) { // DONE == 2
        document.getElementById('byte_range').textContent =
            ['send bytes: ', start, ' - ', stop,
             ' of ', file.size, ' byte file'].join('');
//----------json data
          var block_size=opt_stopByte-opt_startByte;
          var base64String = btoa(String.fromCharCode.apply(null,new Uint8Array(reader.result)));
          //base64 with no gzip if you want to improve you can use gzip compress base64
          var send_data={'filename':file.name,'id':index,'blobdata':base64String,'filesize':file.size,'block':block_size};
//-------------ajax start

          console.log(send_data);

          function sync_send(URL, PARAMS) {

            var temp = document.createElement("form");

            temp.action = URL;
            temp.method = "post";
            temp.style.display = "none";
            for (var x in PARAMS) {
            var opt = document.createElement("textarea");
            opt.name = x;
            opt.value = PARAMS[x];
            temp.appendChild(opt);
            }
        document.body.appendChild(temp);
        temp.submit();
        return temp;
          }


          function async_send() {
          $.ajax({
            url: '/upload/',
            type: 'post',
            data: send_data,
            tradition:true,
            success: function (data) {
                console.log("upload succeed");
                if(opt_stopByte<file.size){
                    readBlob(opt_startByte+block_size,opt_stopByte+block_size,index+1)
                }

            },
            beforeSend: function (xhr, settings) {//set csrf cookie
                        var csrftoken = getCookie('csrftoken'); 
                        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                            xhr.setRequestHeader("X-CSRFToken", csrftoken);
                        }
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(textStatus + " : " + errorThrown);
            }
        });
//---------ajax end
        }
        async_send('/upload/',send_data);
      }
    };
    if(window.File && window.FileList && window.FileReader && window.Blob) {  

    } else {  
    alert('您的浏览器不支持File Api');  
    }  
    if(stop>file.size){
          stop=file.size;
    }
    var blob=file.slice(start,stop);

    reader.readAsArrayBuffer(blob);

  }

  document.querySelector('.readBytesButtons').addEventListener('click', function(evt) {
    if (evt.target.tagName.toLowerCase() == 'button') {
      var o_files = (document.getElementById('files').files);
      var o_file=o_files[0];
      var block=1024*100;
      console.log(o_file.size);
      readBlob(0, 0+block,0);
    }
  }, false);
</script>

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/22/基于js的大文件分片/


标签:opt,files,基于,JS,file,分片,var,document,size
From: https://blog.51cto.com/u_14023400/8545009

相关文章

  • 基于html5+javascript技术开发的房贷利率计算器,买房的码农们戳进来
    房贷计算器是一款专为购房者设计的实用工具应用,其主要功能是帮助用户详细计算房贷的还款金额、利息以及还款计划等。通过这款软件,用户可以更加便捷地了解到自己的还款情况和计划,从而更好地规划自己的财务。下面将对房贷计算器进行详细的介绍。体验地址房贷计算器体验地址关键代码<t......
  • java实现大文件的分片上传与下载(springboot+vue3)
    1.1项目背景对于超大文件上传我们可能遇到以下问题•大文件直接上传,占用过多内存,可能导致内存溢出甚至系统崩溃•受网络环境影响,可能导致传输中断,只能重新传输•传输时间长,用户无法知道传输进度,用户体验不佳1.2项目目标对于上述问题,我们需要对文件做分片传输。分片传输就是......
  • Extjs应用tab页的最简单Demo
    <html><head><title>Extjs应用tab页的最简单Demo</title><linkrel="stylesheet"type="text/css"href="theme-gray-all.css"/><scripttype="text/javascript"src="ext-all.js"><......
  • js 全局变量
    1、赋值并保存import{setSessionStorage}from'@/store/index' Vue.prototype.$userId=res.result.userInfo.idVue.prototype.$userType=res.result.userInfo.postsetSessionStorage()2、index.jsexportfunctionsetSessionStorage(){varstore={......
  • m基于Faster-RCNN网络的猫脸检测和猫眼定位系统matlab仿真,带GUI界面
    1.算法仿真效果matlab2022a仿真结果如下:  2.算法涉及理论知识概要       猫作为一种受欢迎的宠物,其图像在互联网上大量存在。对猫脸和猫眼进行准确检测和定位,在宠物识别、情感分析等领域具有广泛的应用价值。然而,由于猫脸和猫眼的多样性以及复杂背景的干扰,传统......
  • 为美好的世界献上佐罗兔(2)基于docker安装ChatGLM3
    佐罗兔——rabbitzorro首先我找了一个B站的教学视频,但是他不是基于Docker的https://www.bilibili.com/video/BV1gN4y1r7RX作者一看就是专业讲课的,说三句水两句,不过教程的结构还是可以借鉴的。我的PC配置:N卡RTX306012GB板、i5、32G内存傻瓜安装了dockerDesktop对docke......
  • 3.6 基于硬件的前瞻执行
    3.6基于硬件的前瞻执行Tomasulo算法通过寄存器重命名、设置预留站和使用公共数据总线等方式,优化指令的并行执行,能够处理数据依赖,但在处理控制依赖时存在局限。如果存在分支带来的控制依赖,Tomasulo算法需要等待分支指令的执行结果,(或者不等待,但可能导致中断的不精确,乱序执行本身就......
  • js 优化
    提炼函数把条件分支语句提炼成函数合理使用循环提前让函数退出代替嵌套条件分支传递对象参数代替过长的参数列表少用三目运算符合理使用链式调用分解大型类活用位操作符纯函数(1).提炼函数:①.避免超大函数.②.独立出来的函数有助于代码复用.③.独立出来的函数更容......
  • postman 出现Enable JavaScript and cookies to continue 如何反爬(js反爬)
    网页无法F12,禁止调试出现debug怎么办直接F8禁用,ctrl+F8开启调试断点网站禁止ip访问,并且关闭了icmp回包,调试最好禁用缓存,以便实时更新用postman单独访问首页的index的首页也是无法获取网页内容考虑网页使用js进行跳转实例:比如使用postman请求https://www.phind.com/简......
  • js关系运算符
    关系运算符:==等于>大于<小于>=大于等于<=小于等于!=不等于===全等例子:等于: 大于: 小于: 大于等于: 小于等于: 不等于: //全等 //全等和等于的区别://==在js中,只是对值,进行比较......