首页 > 其他分享 >大文件上传之--切片上传和断点续传

大文件上传之--切片上传和断点续传

时间:2023-09-23 19:11:44浏览次数:31  
标签:断点续传 -- item partList let file e4% total 上传

<template>
  <div id="app">
    <el-upload
      drag
      action
      :auto-upload="false"
      :show-file-list="false"
      :on-change="changeFile"
    >
      <i class="el-icon-upload"></i>
      <div class="el-upload__text">
        将文件拖到此处,或
        <em>点击上传</em>
      </div>
    </el-upload>

    <!-- PROGRESS -->
    <div class="progress">
      <span>上传进度:{{ total | totalText }}%</span>
      <el-link
        type="primary"
        v-if="total > 0 && total < 100"
        @click="handleBtn"
        >{{ btn | btnText }}</el-link
      >
    </div>

    <!-- VIDEO -->
    <div class="uploadImg" v-if="video">
      <video :src="video" controls />
    </div>
  </div>
</template>
<script>
import { fileParse } from "./assets/utils";
import axios from "axios";
import SparkMD5 from "spark-md5";

export default {
  name: "App4",
  data() {
    return {
      total: 0, //上传进度条
      video: null, //存储地址path
      btn: false, //暂停和开始按钮
    };
  },
  filters: {
    btnText(btn) {
      return btn ? "继续" : "暂停";
    },
    totalText(total) {
      return total > 100 ? 100 : total;
    },
  },
  methods: {
    async changeFile(file) {
      if (!file) return;
      file = file.data;

      // 1解析为BUFFER数据
      // 32我们会把文件切片处理:把一个文件分割成为好几个部分(固定数量/固定大小)
      // 每一个切片有自己的部分数据和自己的名字
      // HASH_1.mp4
      // HASH_2.mp4

      let buffer = await fileParse(file, base64);
      (spark = new SparkMD5.ArrayBuffer()),
        hash,
        suffix,
        spark.append(buffer),
        (hash = spark.end());
      suffix = /\.([0-9a-zA-Z]+)$/i.exec(file.name)[1];
      // 创建100个切片,生成切片
      let partList = [];
      partsize = file.size / 100;
      cur = 0;
      for (let i = 0; i < 100; i++) {
        let item = {
          chunk: file.slice(cur, cur + partsize),
          filename: `${hash}_${i}.${suffix}`,
        };
        cur += partsize;
        partList.push(item);
      }
      this.partList = partList;
      this.hash = hash;
      this.requestList();
    },
    async requestList() {
      let requestList = [];
      this.partList.forEach((item, index) => {
        let fn = () => {
          let fordata = new FormData();
          formData.append("chunk", item.chunk); //append传给服务器的名字叫chunk   值是item.chunk
          formData.append("filename", item.filename);
          return axios
            .post("/single3", formData, {
              headers: { "Content-Type": "multipart/form-data" },
            })
            .then((result) => {
              result = file.data;
              if (code === 0) {
                total += 1;
                this.partList.splice(index, 1);
              }
            });
        };
        requestList.push(fn);
      });
    },
  },
};

参考文章:http://blog.ncmem.com/wordpress/2023/09/23/%e5%a4%a7%e6%96%87%e4%bb%b6%e4%b8%8a%e4%bc%a0%e4%b9%8b-%e5%88%87%e7%89%87%e4%b8%8a%e4%bc%a0%e5%92%8c%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0/

欢迎入群一起讨论

 

 

标签:断点续传,--,item,partList,let,file,e4%,total,上传
From: https://www.cnblogs.com/songsu/p/17724924.html

相关文章

  • Black-Box Attack-Based Security Evaluation Framework forCredit Card Fraud Detect
    Black-BoxAttack-BasedSecurityEvaluationFrameworkforCreditCardFraudDetectionModels动机AI模型容易受到对抗性攻击(对样本添加精心设计的扰动生成对抗性示例)现有的对抗性攻击可以分为白盒攻击和黑盒攻击。白盒攻击:攻击者可以访问有关目标模型的所有信息,包括训练集......
  • mysql 月份差_MySQL时间差返回月个数
    Sql代码selectPERIOD_DIFF(date_format(now(),'%Y%m'),date_format('2010-11-30','%Y%m'))1.MySQL为日期增加一个时间间隔:date_add()Sql代码set@dt=now();selectdate_add(@dt,interval1day);--add1dayselectdate_add(@dt,int......
  • MyBatis MySQL limit分页含运算动态语句
    MySQL基本的分页语句select*fromtablelimitoffset,pageSize正常情况下是没问题的,如果offset是动态的select*fromtablelimit(pageNum-1)*pageSize,pageSize这样就无法执行了。具体原因可以在MySQL中直接执行这种含运算符的语句试下就知道了。现在给出两种解决方案使用MySQ......
  • mybatis大于小于等于的写法
    第一种写法(1):原符号<<=>>=&'"替换符号<<=>>=&'"例如:sql如下:create_date_time>=#{startTime}andcreate_date_time<=#{endTime}第二种写法(2):大于等于=]]>小于等于例如:sql如下:create_date_time=]]>#{startTime}......
  • Mysql计算月份差
    hiredate是数据库当中的时间now()获取的是当前时间DATE_FORMAT()对时间进行格式化SELECT*,PERIOD_DIFF(DATE_FORMAT(now(),'%Y%m'),DATE_FORMAT(hiredate,'%Y%m'))hiredate是数据库当中的时间now()获取的是当前时间DATE_FORMAT()对时间进行格式化SELECT*,PERIOD_DIFF(DAT......
  • 无涯教程-JavaScript - NORM.S.DIST函数
    描述NORM.S.DIST函数返回标准正态分布(平均值为零,标准偏差为1)。使用此功能代替标准法线区域的表格。语法NORM.S.DIST(z,cumulative)争论Argument描述Required/OptionalZThevalueforwhichyouwantthedistribution.RequiredCumulative累积值是确定函数形式......
  • mysql 月份差_MySQL时间差返回月个数
    Sql代码selectPERIOD_DIFF(date_format(now(),'%Y%m'),date_format('2010-11-30','%Y%m'))1.MySQL为日期增加一个时间间隔:date_add()Sql代码set@dt=now();selectdate_add(@dt,interval1day);--add1dayselectdate_add(@dt,int......
  • 在 Shell命令中,通常会使用通配符表达式来匹配一些文件
    #在Shell命令中,通常会使用通配符表达式来匹配一些文件*,?,[],{}例:字符含义实例匹配0或多个字符a*ba与b之间可以有任意长度的任意字符,也可以一个也没有,如aabcb,axyzb,a012b,ab。?匹配任意一个字符......
  • MongoDB (Document-Web)
    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,类似Json的Bjson格式,因此可以存储比较复杂的数据类型。MongoDB最大的特点是他支持查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可......
  • 告警日志出现"which is different from the number of indexes 4 defined in the MySQ
    问题描述:告警日志出现"whichisdifferentfromthenumberofindexes4definedintheMySQL"报错,如下所示:数据库:MySQL5.7.211、告警日志########################################ErrorDetail########################################23092121:30:00[ERROR]Tablet......