首页 > 其他分享 >js实现大文件上传——分片上传方法

js实现大文件上传——分片上传方法

时间:2023-11-14 14:59:39浏览次数:30  
标签:文件 end 分片 js let file e4% 上传

当前端在开发过程中遇到上传文件需求,如果是上传头像、图片小文件之类的,可以正常按上传流程处理。但是当遇到上传大文件需求时,几个G或者十几个G,那么需要将这么大的文件分割成许多小片段分别上传,这种实现思路称为分片上传。

实现分片上传,精髓就是将文件分割成小片段,此时我们需要用到FormData对象和Bolb对象。

核心代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
  
  </style>
</head>
<body>
  <input type="file" name="file" id="file">
  <button id="upload" onClick="upload()">上传</button>
  <script>
      //设置每个切片大小
      let bytesPerPiece = 1024*1024
      //上传文件函数
      function upload(){
          //获取上传文件
          let file = document.getElementById('file').files[0];
          let start = 0, end, index = 0, filesize = file.size, name = file.name;
          //计算切片总数
          let totalPieces = Math.ceil(filesize/bytesPerPiece);
          while(start < totalPieces){
              end = start + bytesPerPiece;
              if(end > filesize){ 
                  end = filesize
              }
              let chunk = file.slice(start, end);
              let formData = new FormData();
              formData.append('file', chunk, filename);
              //原生js发请求
              //   let xhr = new XMLHttpRequest();
              //   xhr.onreadystatechange = function(){
              //       if(this.readyState == 4 && this.status == 200){

              //       }
              //   }
              //   xhr.open('post', '/api/upload', true);
              //   xhr.send(formData);
              // 使用jquery,需要将contentType,processData设置为false
            //   $.ajax({
            //       url: '/api/upload',
            //       type: 'post',
            //       data: formData,
            //       processData: false,
            //       contentType: false
            //   }).success(res=>{

            //   }).error(err=>{

            //   })
          }
      }
  </script>
</body>
</html>

附加: 断点续传

理解:断点续传,就是在我们上传过程中由于意外原因断网断电情况让上传终止了,那么上传的是不完整的,我们需要向服务器查询一下相同名字的文件大小,然后将上传位置设置成这个大小即可。

 

参考文章:http://blog.ncmem.com/wordpress/2023/11/14/js%e5%ae%9e%e7%8e%b0%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0-%e5%88%86%e7%89%87%e4%b8%8a%e4%bc%a0%e6%96%b9%e6%b3%95/

欢迎入群一起讨论

 

 

标签:文件,end,分片,js,let,file,e4%,上传
From: https://www.cnblogs.com/songsu/p/17831555.html

相关文章

  • js 计算两个地点坐标之间的间距
    /***计算两个地点坐标之间的间距*@param{array}location1[lon:string,lat:string]地点坐标*@param{array}location2[lon:string,lat:string]地点坐标*/exportfunctioncalculateDistance(location1,location2){ constearthRadius=6371//地球半......
  • 原生JS实现视频截图
    视频截图效果预览利用Canvas进行截图要用原生js实现视频截图,可以利用canvas的绘图功能ctx.drawImage,只需要获取到视频标签,就可以通过drawImage把视频当前帧图像绘制在canvas画布上。constvideo=document.querySelector('video')constcanvas=document.createElement('c......
  • 表格数据拖拽排序 sortable.js
    需求拖拽表格的行数据,实现排序。问题拖拽后调用接口,但视图没变,还是原来的顺序场景:拖拽表格行数据后,tableDataArr中数据的orderNum值会改变,实现拖拽换序。期望情况:页面根据更改后的orderNum重新排序。实际情况:接口数据变了,但是页面行数据没有改变。也就是说,页面没有实现......
  • app直播源代码,JS 替换日期的横杠为斜杠
    app直播源代码,JS替换日期的横杠为斜杠例如1:   vardt="2010-01-05";      vardt=dt.replace("-","/");    //只替换第一个“-”:2010/01-05  alert(dt); ​例如2:   vardt="2010-01-05";     vardt=dt.replace(/-/g,"/&q......
  • 原生JS上传大文件分片
    上传大文件分片是一种常见的上传方式,可以有效地避免上传过程中出现网络中断等问题导致的上传失败。下面是一个使用原生JS实现上传大文件分片的示例代码: javascript//定义上传文件的分片大小constCHUNK_SIZE=1024*1024;//1MB//获取文件的MD5值functiongetFi......
  • VSCode 中 Json 文件介绍
    VisualStudioCode官方文档1.Json配置文件EditingJSONwithVisualStudioCodesettings.json分类defaultsettings.json:只读格式,相当于官方的参考文档;settings.json:自定义形式,优先级大于默认的settings.json文件,ctrl+shift+o查看默认提供的格式,而后自定......
  • js:React中使用classnames实现按照条件将类名连接起来
    参考文档https://www.npmjs.com/package/classnameshttps://github.com/JedWatson/classnames安装npminstallclassnames示例importclassNamesfrom"classnames";//字符串合并console.log(classNames("foo","bar"));//foobar//对象合并console.lo......
  • js:可选链运算符(?.)和空值合并运算符(??)
    文档:可选链运算符(?.)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Optional_chaining空值合并运算符(??)https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing目录1、可选链运算符(?.)2、空值合并运算......
  • 基于React使用swiperjs实现竖向滚动自动轮播
    很多文章,都只提供了js部分,包括官方的文档也只有js部分,如果css设置不正确,会导致轮播图不自动播放。使用的swiper版本:v11.0.3文档https://swiperjs.com/get-startedhttps://swiperjs.com/react实现效果使用vite创建react应用pnpmcreatevitereact-app--templatereact完整依赖pac......
  • PHP大文件分割分片上传实现代码
    这篇文章主要介绍了PHP大文件分割分片上传实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关upload_max_filesize=2M//PHP最大能接受的文件大小post_max_s......