首页 > 其他分享 >原生JS实现大文件分片

原生JS实现大文件分片

时间:2023-10-22 09:45:10浏览次数:30  
标签:原生 index const log JS file 分片 console 上传

为了实现断点续传,研究了js的文件分片

实现断点续传的步骤

  • 文件分片按顺序上传,上传第一个后文件名md5加密保存到rdis的key,value保存为上传的index,
  • 然后下面每次上传成功就更新对应的value,保持最新的
  • 第一次上传时,查询redis是否已经存在相同的key,如果相同就跳到保存的index的下一个上传
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Title</title>
  </head>
  <body>
    <div>
      <!-- 获取文件 -->
      <input type="file" name="选择文件" id="file-upload" />
      <!-- 点击执行 -->
      <input type="button" value="确定" onclick="update(0)" />
      <br />
      <input type="text" id="显示" />
    </div>

    <script>
      // 切片大小
      const chunkSize = 1024 * 1024 * 1 // 确定分片大小
      const xml = new XMLHttpRequest() // ajax请求
      function update(index) {
        // index是上传标记的序列
        const file = document.getElementById('file-upload').files[0] // 获取文件
        console.log('file', file)
        
        // 获取文件的名字和拓展名
        const lastPoint = file.name.lastIndexOf('.')
        const filename = file.name.slice(0, lastPoint)
        const ext = file.name.slice(lastPoint + 1)
        console.log('filename', filename)
        console.log('ext', ext)
        const star = index * chunkSize // 切片的起点
        // 判断起点是否已经超过文件的长度,超过说明已经
        if (star > file.size) {
          return
        }

        const bool = file.slice(star, star + chunkSize) // slice(分割起点,分割终点)是js切割文件的函数,
        console.log('bool', bool)
        const boolname = `${filename}-${index}-${ext}`
        console.log('boolname', boolname)
        const boolfile = new File([bool], boolname) // 把分割后的快转成文件传输
        console.log('boolfile', boolfile)
        const from = new FormData() //定义集合方便后端接收

        from.append('index', index)
        from.append('chunkSize', chunkSize)
        from.append('name', file.name)
        from.append('file', boolfile)
        console.log('from', from)
        xml.open('post', '/接收文件', true) // 发送请求
        xml.send(from) //携带集合
        xml.onreadystatechange = function () {
          if (this.readyState === 4 && this.status === 200) {
            //alert(this.responseText)
            if (this.responseText === '上传完成') {
              //按顺序上传,只有上一片上传成功下一个才能上传
              //这里可以加个判断,获取断点,获取后下一个,后端也会判断切片是否已经下载过
              update(++index)
              document.getElementById('显示').value = star / file.size //显示上传的进度
            }
          }
        }
      }
    </script>
  </body>
</html>
 

参考文章:http://blog.ncmem.com/wordpress/2023/10/22/%e5%8e%9f%e7%94%9fjs%e5%ae%9e%e7%8e%b0%e5%a4%a7%e6%96%87%e4%bb%b6%e5%88%86%e7%89%87/

欢迎入群一起讨论

 

 

标签:原生,index,const,log,JS,file,分片,console,上传
From: https://www.cnblogs.com/songsu/p/17779926.html

相关文章

  • Vue.js框架:vue3版本引入使用element-ui
    一、引入element-pluselement-ui只支持vue2,vue3需要引入element-plus进行使用,两个分别对应vue2和3两个版本,各自独立,无法跨级兼容。地址:https://element-plus.gitee.io/在vue3项目终端里使用以下命令引入该依赖:npminstallelement-plus--save二、修......
  • nodejs 安装升级解决导入es6语法兼容性问题??=
    nodejs无法识别??==的问题是因为nodejs的版本太老,而引入的模块中包含了新的语法,例如空值运算符??=。这样nodejs就会报错。解决方法大概有三个1,找到对应老版本的模块使用。2,修改模块中不兼容的语法。3,更新nodejs。三个方法中前两个显然会面临大量工作。作为懒人的我,选择了方......
  • Python-Json异常:Object of type Decimal is not JSON serializable
    源起:使用python分离出一串文本,因为是看起来像整数,结果json转换时发生异常:TypeError:ObjectoftypeDecimalisnotJSONserializablemsgInfo={"uid":3232324232}json.dumps(msgInfo,ensure_ascii=False)原因:decimal格式不能被json.dumps正确处理。json.dumps函数发现字......
  • js逆向·找到登录时目标网站的加密算法的几种方式
    js逆向·找到登录时目标网站的加密算法的几种方式为什么要去找到目标网站的加密密码方法:为了要把我们的payload正确的带入目标网站的服务器进行逻辑验证,那么就需要知道对方使用的什么加密或者编码规则来处理数据的,比如说我们输入的密码被base64编码了,然后发送给后端,后端会进行解......
  • php js + laravel + mysql开发的手术麻醉临床信息系统源码
    手术麻醉临床信息系统有着完善的临床业务功能,能够涵盖整个围术期的工作,能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施,能够规范麻醉科的工作流程,实现麻醉手术过程的信息数字化,自动生成麻醉的各种医疗文书,完成共享HIS、LIS、PACS和EMR等手术患者信息,从而提......
  • 云原生架构实战02 Kubernetes实战入门
    一、Kubernetes是什么?kubernetes具有以下特性:服务发现和负载均衡Kubernetes可以使用DNS名称或自己的IP地址公开容器,如果进入容器的流量很大,Kubernetes可以负载均衡并分配网络流量,从而使部署稳定。存储编排Kubernetes允许你自动挂载你选择的存储系统,例如本地存储、公共云提......
  • js 大文件切片,中止上传,上传进度,断点续传
    大文件切片上传背景介绍:当涉及大文件上传时,一种有效的方法是将大文件分割成小切片并逐个上传。这种技术不仅可以减轻服务器的负担,还可以避免上传过程中的中断和内存问题。本文将介绍如何使用JavaScript实现大文件切片上传,并解释如何处理断点续传、并发控制以及上传取消等问题,用到......
  • java项目实践-jsp-finter-监听器-day19
    目录1.jsp2.过滤器3.listener监听器1.jspservle逻辑处理方便html页面表现麻烦jsp页面表现方便但是逻辑处理麻烦JSP是一种页面技术JSP本质上是servlet类通过JSP引擎翻译成servletjsp约等于java+html注意:jsp不是访问静态的html文件index.jsp修改成如下代码:<%-......
  • json序列化数据超出最大值(maxJsonLength)
    https://www.cnblogs.com/ellafive/p/13704301.html 1、序列化:以下代码在对象过大时会报错:进行序列化或反序列化时出错。字符串的长度超过了为maxJsonLength属性设置的值。//jsonObj比较大的时候会报错varserializer=newJavaScriptSerializer();returnserializer.Ser......
  • The JSON value of length n is too large and not supported
    https://github.com/dotnet/runtime/issues/39953 I'mreferringtothisissue #30746 thatwasclosedwithlimitof125MBstayingfixedopposedtobeingconfigurable.Itwasarguedthattherewouldbenocommoncaseshittingthe125MBlimit.Suchcases......