首页 > 其他分享 >HTML5 大文件断点续传完整思路整理

HTML5 大文件断点续传完整思路整理

时间:2023-10-14 11:35:58浏览次数:38  
标签:断点续传 文件 接口 切片 HTML5 var 思路 spark MD5

用 html5 的新特性分割文件,为达到断点续传功能

用 spark.js 获取文件md5以确保文件的唯一性

流程概述:

  复制代码
  (此功能前端共需调用3个接口,分别为简称作 A / B / C)

  1,获取文件信息:使用HTML5的原生上传input,选择文件后,获取文件的所有信息(文件名、文件总字节数等)

  2,计算总切片:跟后台约定好单个切片大小,比如1M/片,计算文件总大小/单个切片大小=总切片数

  3,计算文件MD5和每个切片的MD5:引用spark-md5.min.js来生成MD5,此js的调用可以获取文件MD5、切片的MD5和切片的数据

  4,调用A接口查询从第几个切片开始上传:需要向后台传入的关键参数是文件名、文件总大小、文件的MD5

  5,获取到初始上传切片位置,正式开始分片上传到服务器:从A接口获取到切片位置后,调用接口B,将切片的MD5和切片数据传给后台,此后循环调用接口B,直到最后一切片上传结束

  6,所有切片上传结束后,调用接口C将文件存库

详细代码展示:

HTML:

  复制代码
<input type='file' title="" accept=".mp4" 
       name='myfiles' id="mediaFile" class="" onchange="handleFile()" />

获取文件信息:

  复制代码
function handleFile() {
     var fileInputs = $("input[name='myfiles']")[0]; //获取input里的文件信息
     //切割文件的每条内容分别存放
     var name = fileInputs.files[0].name, //文件名           
         size = fileInputs.files[0].size, //文件总字节 
         type = fileInputs.files[0].type, //文件类型 (此功能暂且用不到)
         shardSize = 1024 * 1024, // 每个切片的总字节数,比如此时以1M为一个分片
         shardCount = Math.ceil(size / shardSize); //总片数
}

计算整个文件的MD5:(前提是引入了spark.js,下载地址: js-spark-md5

  复制代码
var singleFileData = new Array(); //初始空数组,储存所有的切片数据
var fileReader = new FileReader(),
   blobSlice = File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice,
   chunkSize = shardSize , //单个切片的总字节数
   chunks = shardCount, //总片数
   currentChunk = 0;
var spark = new SparkMD5.ArrayBuffer();
    fileReader.onload = function (e) {
    //*******获取分片文件,用于计算所有切片的MD5***
       for (var i = 0; i < chunks; i++) {
         var start = i * chunkSize,
         end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize;
         var sliceFile = blobSlice.call(file, start, end);
         // 调用此方法,计算每个切片的MD5
          getChunkMd5(sliceFile, i);
         }
    //*****************************
    spark.append(e.target.result);
    if (currentChunk < chunks) {
       currentChunk++;
       loadNext();
    } else {
      var allFileEnd = spark.end()
       console.log("此值为整个切片的MD5", allFileEnd)
       //真实MD5值 :allFileEnd=a0ce27800ee7d948422f3fe16e898f22
       // ***调用接口(1),查询从第几个切片开始上传***
       // ***在此处写接口A的调用方法***
     }
    };
 function loadNext() {
  //计算切片的start,end,用于切割出切片的数据
  var start = currentChunk * chunkSize,
  end = start + chunkSize >= file.size ? file.size : start + chunkSize;
  fileReader.readAsArrayBuffer(blobSlice.call(file, start, end));
   //储存切片的数据
   //判断如果singleFileData小于总切片数,则继续往数组添加切片数据
   if (singleFileData.length != chunks) {
    singleFileData.push(blobSlice.call(file, start, end)) //将每个切片push到空数组里
   }
  };
  //调用此方法,循环获取切片数据
  loadNext()

计算切片的MD5:

(此步骤其实可以省略,但为了严谨后端需要根据前端传入的切片数据计算出MD5,跟前端传入的MD5对比)
  复制代码
    var mySingleFileMd5 = []; //用于储存所有切片的MD5
    function getChunkMd5(file, i) {
       var spark = new SparkMD5.ArrayBuffer();
       var fileReader = new FileReader();
       fileReader.onload = function (e) {
         spark.append(e.target.result);
         mySingleFileMd5[i] = spark.end();// 将每个切片的MD5存起来
         console.log("所有切片的MD5数组=", mySingleFileMd5);
       }
       fileReader.onerror = function () {
         console.warn('oops, something went wrong');
       }
       function loadNext() {
         fileReader.readAsArrayBuffer(blobSlice.call(file, 0, file.size));
       }
   loadNext();
  }

调用接口A后获取到 PARTINDEX(从第几个切片开始上传),接着调用接口B进行上传,上传后手动计算进度。

A接口传参、取参如下:

  复制代码
var params = {
          serviceid: 'wcm61_bigfile',
          methodname: 'startUpload',
          fileName: 手机QQ视频_20181212094958.mp4,
          fileDigest:  65309fc9684b4eb2f3d281da5ad17b6e,
          fileSize: 100904886,
        };
{
    "MSG":"操作成功",
    "DATA":{
        "TOTALPARTCOUNT":"49",
        "PARTINDEX":"1",  //此字段就是后台告诉前端从第几个切片开始上传
        "PARTSIZE":"2097152",
        "FLAG":"1",
        "FILENAME":"手机QQ视频_20181212094958.mp4"
     },
    "ISSUCCESS":"true"
}

B接口传参、取参如下:

  复制代码
  var data = singleFileData[partIndex - 1] //切片数据
  var fileName =手机QQ视频_20181212094958.mp4; //文件名
  var fileDigest = 65309fc9684b4eb2f3d281da5ad17b6e; //文件的MD5
  var partIndex = 1; //切片位置
  var partDigest = ea58e21870ad4c22f2c75645564654b2; //切片的MD5
{
    "filename":"手机QQ视频_20181212094958.mp4",
    "PARTINDEX":"2",  //下次开始传第2个切片
    "PARTSIZE":"2097152", //切片大小
    "totalPartCount":"49" //总切片数
    "ISSUCCESS":"1"
}

通过B接口,不断将切片上传到服务器,并且实时计算上传进度

  复制代码
var processNum = 
     parseInt((PARTINDEX - 1) / totalPartCount * 100)  // 已上传的切片/总切片数 

最终实现静态效果和接口如下:

 

 

参考文章:http://blog.ncmem.com/wordpress/2023/10/14/html5-%e5%a4%a7%e6%96%87%e4%bb%b6%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0%e5%ae%8c%e6%95%b4%e6%80%9d%e8%b7%af%e6%95%b4%e7%90%86-2/

欢迎入群一起讨论

 

 

 

标签:断点续传,文件,接口,切片,HTML5,var,思路,spark,MD5
From: https://www.cnblogs.com/songsu/p/17763933.html

相关文章

  • HTML5实现文件断点续传的方法
    HTML5的FILEapi,有一个slice方法,可以将BLOB对象进行分割。前端通过FileList对象获取到相应的文件,按照指定的分割方式将大文件分段,然后一段一段地传给后端,后端再按顺序一段段将文件进行拼接。断点续传原理目前比较常用的断点续传的方法有两种,一种是通过websocket接口进行文件上传......
  • H5怎么实现文件断点续传
    这次给大家带来H5怎么实现文件断点续传,H5怎么文件断点续传的注意事项有哪些,下面就是实战案例,一起来看一下。HTML5的FILEapi,有一个slice方法,可以将BLOB对象进行分割。前端通过FileList对象获取到相应的文件,按照指定的分割方式将大文件分段,然后一段一段地传给后端,后端再按顺序一段......
  • html5解决大文件断点续传
    一、使用fileapi对文件“切片”,使用slice断点续传思路:断点续传最核心的内容就是把文件“切片”然后再一片一片的传给服务器,但是这看似简单的上传过程却有着无数的坑。首先是文件的识别,一个文件被分成了若干份之后如何告诉服务器你切了多少块,以及最终服务器应该如何把你上传......
  • 互补滤波姿态解算算法思路
    ......
  • Html5大文件断点续传实现方法
    大文件分块一般常用的web服务器都有对向服务器端提交数据有大小限制。超越一定大小文件服务器端将返回拒绝信息。当然,web服务器都提供了配置文件可能修改限制的大小。针对ii实现大文件的上传网上也有一些通过修改web服务器限制文件大小来实现。不过这样对web服务器的平安带了问题......
  • 嵌入式调试驱动的思路
    1问题源于硬件的改动,并且只能去改硬件才能解决问题。2问题源于硬件的改动,要解决问题,可以去改硬件也可以去改软件,比如屏幕uboot,与kernel之间的白屏问题。3问题源于软件的改动,但是要解决问题,可以去改硬件也可以去改软件。比如Android的双击屏幕唤醒的问题。4问题源于软......
  • Redis中的Big Key问题:排查与解决思路
    本文已收录至GitHub,推荐阅读......
  • HTML5中怎么实现文件断点续传功能
    HTML5中怎么实现文件断点续传功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。断点续传原理目前比较常用的断点续传的方法有两种,一种是通过websocket接口进行文件上传,另一种是通过ajax,两种方法各有......
  • html5+css3
    一、HTML1、浏览器内核又可以分成两部分:渲染引擎(layoutengineer)和JS引擎(renderingengine)后来的JS的发展独立出来,常用5大浏览器分别是:IE(edge)、Chrome、Firefox、Safari、opera。浏览器内核有那些?分别被使用在那些浏览器?Trident(IE)国内很多双核浏览器其中一核就是trident......
  • 通过Java实现文件断点续传功能
    用户上传大文件,网络差点的需要历时数小时,万一线路中断,不具备断点续传的服务器就只能从头重传,而断点续传就是,允许用户从上传断线的地方继续传送,这样大大减少了用户的烦恼。本文将用Java语言实现断点续传,需要的可以参考一下什么是断点续传用户上传大文件,网络差点的需要历时数小......