·····················断更有点久了,工作太忙,个人太散漫了。还是要学会坚持写博客,毕竟也是自己学习进步的体现。闲话少说,直接进入今天的正题,文件的分片上传。
先介绍一下文件的分片上传。

1、分片上传的原理

分片上传功能是将一个文件切割为一系列特定大小的小数据片,分别将这些小数据片分别上传到服务端,全部上传完后再由服务端将这些小数据片合并成为一个完整的资源。在上传过程中一旦遭受外部因素导致的上传中断,在下次上传时将坚持该文件上传的上传进度,然后接着上次上传进度继续上传,这也就是断点续传。

2、文件分片上传的意义

在上传普通大小文件时,分片上传和普通上传的效果体验相差不大。
但是在上传大型文件时,普通传统上传方式存在的弊端有:

1:文件上传速度缓慢
2:各种原因(断网,页面关闭等等)引起的文件上传失败导致文件丢失,需重新上传 而分片上传有效避免了传统上传方式引起的弊端。

已有的分片上传组件 百度:WebUploader

为什么不直接使用百度的分片上传呢?是写的不好还是什么呢?当然不是,这个组件的功能还是很强大的,我们不用的原因是,可能在很多功能需求上这个组件并不满足我们的需求,我们花很多时间去改组件的UI和功能为什么不自己写一个更方便呢。

3、分片上传的实现

分片上传的整个流程大致如下:
(1) 将需要上传的文件按照一定的分割规则,分割成相同大小的数据块;

(2) 向服务端发送上传请求,上传时携带完整文件的唯一标识(建议使用MD5加密值就行),服务端判断该文件是否存在,不存在是返回同意上传信息。

(3) 接收到服务端同意上传后,按照一定的策略(串行或并行)发送各个分片数据块,每个分片携带分片信息(分片总数,分片索引,分片唯一索引,分片数据等),采用并行可实现分片秒传的功能,采用串行更好实现断点续传的功能。

(4) 发送完成后,服务端根据判断数据上传是否完整,如果完整,则进行数据块合成得到原始文件。

4、代码实现

这里使用原生input组件再react环境来实现分片上传

1:先向服务端发送文件的唯一标识,判断文件是否已经上传JavaScript是不能直接直接对文件进行MD5加密,这里我们要使用FileReader对象,FileReader主要用于将文件内容读入内存,通过一系列异步接口,可以在主线程中访问本地文件,使用FileReader对象,web应用程序可以异步的读取存储在用户计算机上的文件(或者原始数据缓冲)内容,可以使用File对象或者Blob对象来指定所要处理的文件或数据。

const r = new FileReader();
r.readAsBinaryString(file);
r.onload = e => {const bolb = e.target.result;const md5 = hex_md5(bolb);

2:接收服务端的返回结果判断上传文件的方式,服务端可返回已上传、未上传、上传一部分三种状态。

3:如当我们接收到未上传状态后。对文件进行分片(每片建议不超过10M)。依次将分片上传,上传信息有(分片MD5值,分片总数,当前分片索引,分片数据等)。当一片上传完成后再回调函数上传下一片

const shardSize = 5 * 1024 * 1024; // 以5MB为一个分片 // 计算每一片的起始与结束位置
const start = this.state.i * shardSize;
const end = Math.min(size, start + shardSize); form.append("uuid", uuid);  //文件ID
form.append("action", "upload"); // 直接上传分片
form.append("filemd5", filemd5); // 文件MD5form.append("md5", md5); // 分片MD5
form.append("name", name); //文件名
form.append("size", size); // 文件大小
form.append("total", shardCount); // 总片数
form.append("index", this.state.i + 1); // 当前是第几片
form.append("data", file.slice(start, end)); // 使用slice方法用于切出文件的一部分

4:这里我们使用axios请求,分片上传过程中利用onUploadProgress获得文件上传进度。并且存在一个state变量stateData来控制是否继续上传,stateData初始值为true,当点击取消上传按钮时stateData为false,停止上传,并向服务端发起取消请求,服务端删除已经上传的分片。当点击中止上传按钮时stateData为false,停止上传。

5:如果收到上传一部分状态后。将文件进行分片,在发送每个分片之前先发送检测请求,后端将检测改分片是否上传,未上传的情况下上传该分片,已上传时跳过继续检测下一分片。

const shardSize = 5 * 1024 * 1024; // 以5MB为一个分片 // 计算每一片的起始与结束位置
const start = this.state.i * shardSize;
const end = Math.min(size, start + shardSize);
if(!this.state.action) {form.append("action", "check"); // 检测分片是否上传
} else {form.append("action", "upload"); // 直接上传分片form.append("data", file.slice(start, end)); // slice方法用于切出文件的一部分
}
form.append("uuid", uuid);  //文件ID
form.append("action", "upload"); // 直接上传分片
form.append("filemd5", filemd5); // 文件MD5form.append("md5", md5); // 分片MD5
form.append("name", name); //文件名
form.append("size", size); // 文件大小
form.append("total", shardCount); // 总片数
form.append("index", this.state.i + 1); // 当前是第几片

文件分片上传【前端】相关推荐

  1. 大文件分片上传前端框架_基于Node.js的大文件分片上传

    基于Node.js的大文件分片上传 我们在做文件上传的时候,如果文件过大,可能会导致请求超时的情况.所以,在遇到需要对大文件进行上传的时候,就需要对文件进行分片上传的操作.同时如果文件过大,在网络不佳 ...

  2. 大文件分片上传前端框架_无插件实现大文件分片上传,断点续传

    文件上传.gif 1. 简介: 本篇文章基于实际项目的开发,将介绍项目中关于大文件分片上传.文件验证.断点续传.手动重试上传等需求的使用场景及实现: 2. 项目需求 在一个音视频的添加中,既要有音视频 ...

  3. 大文件分片上传前端框架_js实现大文件分片上传的方法

    文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...

  4. node实现文件分片上传之multer篇

    node实现文件分片上传 前端在做文件上传时,考虑到网速的快慢,如果文件过大的话可能会导致上传时间过长而请求超时,文件上传失败.因此文件过大需要对文件进行分片上传. 那文件分片上传的具体过程是怎样的呢 ...

  5. html上传视频文件前端显示,文件分片上传之前端文件分片

    分片上传的原理就是在前端将文件分片,然后一片一片的传给服务端,由服务端对分片的文件进行合并,从而完成大文件的上传.分片上传可以解决文件上传过程中超时.传输中断造成的上传失败,而且一旦上传失败后,已经上 ...

  6. 大文件分片上传,断点续传,秒传 实现

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  7. jquery 分片上传php,php 大文件分片上传

    前端部分 上传 //上传控件 uploadBig('upload','zip,rar,7z,tar',{ id: '', type: 'upload_file', } ,(res)=>{ //t ...

  8. 无插件实现大文件分片上传,断点续传

    代码地址如下: http://www.demodashi.com/demo/11888.html 1. 简介: 本篇文章基于实际项目的开发,将介绍项目中关于大文件分片上传.文件验证.断点续传.手动重试 ...

  9. java加vue实例_Vue.Js及Java实现文件分片上传代码实例

    upload(file) { //从后台获取已经上传的文件分片数 getIdx(md5) .then(function(res) { let retry = 3; uploadPart(retry, ...

最新文章

  1. poj2240(Bellman-ford)
  2. vi/vim使用教程
  3. android+5.0+小米手环,小米手环5和荣耀手环6哪个好-参数对比
  4. 【BZOJ4008】亚瑟王,概率DP
  5. 问题三十八:C++中bad alloc问题(2)——使用“引用”避免该问题
  6. 关于Cocos2d-x中图集中图片的调用
  7. 相关滤波之开篇Mosse原理及代码详解
  8. 密码编码学与网络安全学习笔记
  9. 微处理器系统结构与嵌入式系统设计(二)
  10. mac电脑投屏到小米盒子_巧用手机自带功能向电脑传无损照片视频 华为小米苹果均支持 小米盒子 苹果手机 投屏软件...
  11. 部署laravel项目报错:No input file specified.的解决办法
  12. 10月15日lol服务器维护,lol10月15日维护到几点 英雄联盟2020年10月15日10.21版本维护结束时间...
  13. 通过httpurlconnection发带图片的文件
  14. STM8/32 芯片数据擦除
  15. 苹果App store 2015最新审核标准
  16. Tableau数据源(一)-引入数据源
  17. 微信退款服务器系统失败怎么办,微信退款多久到账?微信退款不成功怎么办?...
  18. 犀利姐—林家小妹:将犀利进行到底!
  19. 2012 5.4青年节--上海出差
  20. 【Python基础语法记录】

热门文章

  1. 魔改合成大西瓜--11张图片定制(速度最快版)
  2. [matlab]10种经典的时间序列预测模型
  3. android 空调遥控器——简单发送内容
  4. java vector addall_浅谈java.util.Vector类的add()和addAll()方法
  5. cascade的含义
  6. 动效素材极速交付: 腾讯PAG动效组件技术揭秘
  7. 迪士尼公布星战酒店更多细节,强调这不止是酒店
  8. 连阿迪达斯都卖不动了!是国潮太卷,还是消费者对品牌祛魅了?
  9. 2017年全球大数据产业报告之海外篇(第八集)
  10. 一个三流学校程序员的奋斗(勉)