我的编程空间,编程开发者的网络收藏夹
学习永远不晚

结合el-upload组件实现大文件分片上传功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

结合el-upload组件实现大文件分片上传功能

前情提要

Element UI的el-upload上传组件相信各位小伙伴都已经非常熟悉,最近接了一个新需求,要求在el-upload组件基础上实现分片上传功能,即小于等于5M文件正常上传,大于5M文件切成5M每片上传。那么这个功能怎么实现呢?一起看看吧

代码实现

首先,我们需要设置el-upload组件的http-request,这样可以覆盖默认的上传行为,可以自定义上传的实现。

<!-- data是上传时附带的额外参数,uploadFile是覆盖默认上传的方法 -->
<el-upload :data="data" :http-request="uploadFile">
    <el-button icon="el-icon-upload2">本地文件</el-button>
</el-upload>

接下来,uploadFile方法中需要区分文件是否超过5M

async uploadFile({ data, file }) {
  // data是上传时附带的额外参数,file是文件
  let url = "xxx" //上传文件接口
  let loadingInstance = Loading.service({
    text: "正在上传文件,请稍后...",
  });
  try {
    // 如果文件小于5MB,直接上传
    if (file.size < 5 * 1024 * 1024) {
      let formData = new FormData();
      for (let key in data) {
        formData.append(key, data[key]);
      }
      formData.append("file", file);

      const res = await upload(url,formData);
      loadingInstance.close();
      return res;
    } else {
      // 如果文件大于等于5MB,分片上传
      data.file = file;
      const res = await uploadByPieces(url,data);
      loadingInstance.close();
      return res;
    }
  } catch (e) {
    loadingInstance.close();
    return e;
  }
}

upload方法就是正常上传方法,uploadByPieces是分片上传方法,我们可以把它们一个单独的js文件中,方便我们使用。

upload方法:

const upload = (url, data, headers = {}) => {
    return new Promise((resolve, reject) => {
        axios({
            url,
            method: "post",
            data,
            headers: {
                ...headers,
                'Content-Type': 'multipart/form-data'
            }
        }).then(res => {
            return resolve(res.data)
        }).catch(err => {
            return reject(err)
        })
    })
}

在uploadByPieces方法中我们可以使用file.slice对文件进行切片

// 上传过程中用到的变量
const chunkSize = 5 * 1024 * 1024; // 5MB一片
const chunkCount = Math.ceil(file.size / chunkSize); // 总片数
// 获取当前chunk数据
const getChunkInfo = (file, index) => {
    let start = index * chunkSize;
    let end = Math.min(file.size, start + chunkSize);
    let chunk = file.slice(start, end);
    return { start, end, chunk };
};

File对象没有定义任何方法,但它从Blob对象中继承了slice方法:MDN

完整代码

upload.vue

<template>
    <el-upload :data="data" :http-request="uploadFile">
        <el-button icon="el-icon-upload2">文件上传</el-button>
    </el-upload>
</template>
<script>
// 引入上传文件方法
import { upload, uploadByPieces } from "@/utils/upload.js";
// Loading
import { Loading } from "element-ui";

export default {
    props: ["data"],
    methods: {
        async uploadFile({ data, file }) {
          // data是上传时附带的额外参数,file是文件
          let url = "xxx" //上传文件接口
          let loadingInstance = Loading.service({
            text: "正在上传文件,请稍后...",
          });
          try {
            // 如果文件小于5MB,直接上传
            if (file.size < 5 * 1024 * 1024) {
              let formData = new FormData();
              for (let key in data) {
                formData.append(key, data[key]);
              }
              formData.append("file", file);

              const res = await upload(url,formData);
              loadingInstance.close();
              return res;
            } else {
              // 如果文件大于等于5MB,分片上传
              data.file = file;
              const res = await uploadByPieces(url,data);
              loadingInstance.close();
              return res;
            }
          } catch (e) {
            loadingInstance.close();
            return e;
          }
        }
    }
}
</script>

upload.js

import axios from "axios";
//正常上传
const upload = (url, data, headers = {}) => {
    return new Promise((resolve, reject) => {
        axios({
            url,
            method: "post",
            data,
            headers: {
                ...headers,
                'Content-Type': 'multipart/form-data'
            }
        }).then(res => {
            return resolve(res.data)
        }).catch(err => {
            return reject(err)
        })
    })
}
//分片上传
const uploadByPieces = async (url,{ fileName, file }) => {
    // 上传过程中用到的变量
    const chunkSize = 5 * 1024 * 1024; // 5MB一片
    const chunkCount = Math.ceil(file.size / chunkSize); // 总片数
    // 获取当前chunk数据
    const getChunkInfo = (file, index) => {
        let start = index * chunkSize;
        let end = Math.min(file.size, start + chunkSize);
        let chunk = file.slice(start, end);
        return { start, end, chunk };
    };
    // 分片上传接口
    const uploadChunk = (data) => {
        return new Promise((resolve, reject) => {
            axios({
                url,
                method: "post",
                data,
                headers: {
                    'Content-Type': 'multipart/form-data'
                }
            }).then(res => {
                return resolve(res.data)
            }).catch(err => {
                return reject(err)
            })
        })
    }
    // 针对单个文件进行chunk上传
    const readChunk = (index) => {
        const { chunk } = getChunkInfo(file, index);
        let fetchForm = new FormData();
        fetchForm.append("chunk", chunk);
        fetchForm.append("index", index);
        fetchForm.append("chunkCount", chunkCount);
        return uploadChunk(fetchForm)
    };
    // 针对每个文件进行chunk处理
    const promiseList = []
    try {
        for (let index = 0; index < chunkCount; ++index) {
                promiseList.push(readChunk(index))
        }
        const res = await Promise.all(promiseList)
        return res
    }catch (e) {
        return e
    }
}

export { upload, uploadByPieces }

到此这篇关于结合el-upload组件实现大文件分片上传的文章就介绍到这了,更多相关el-upload大文件分片上传内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

结合el-upload组件实现大文件分片上传功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

el-upload大文件切片上传怎么实现

这篇文章主要介绍“el-upload大文件切片上传怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“el-upload大文件切片上传怎么实现”文章能帮助大家解决问题。html
2023-07-05

el-upload大文件切片上传实现示例详解

这篇文章主要为大家介绍了el-upload大文件切片上传实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-15

vue怎么使用el-upload实现文件上传功能

这篇文章主要介绍了vue怎么使用el-upload实现文件上传功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue怎么使用el-upload实现文件上传功能文章都会有所收获,下面我们一起来看看吧。uploa
2023-06-30

element-ui el-upload实现上传文件及简单的上传文件格式验证功能

前端上传文件后,后端接受文件进行处理后直接返回处理后的文件,前端直接再将文件下载下来,下面这篇文章主要给大家介绍了关于element-ui el-upload实现上传文件及简单的上传文件格式验证功能的相关资料,需要的朋友可以参考下
2022-11-16

怎么使用el-upload组件实现递归多文件上传

本篇内容介绍了“怎么使用el-upload组件实现递归多文件上传”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、需求描述:在页面上点击按钮
2023-07-05

uniapp使用u-upload组件来实现图片上传功能

最近在用uniapp开发微信小程序,下面这篇文章主要给大家介绍了关于uniapp使用u-upload组件来实现图片上传功能的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-01-03

利用Vue3+Element-plus实现大文件分片上传组件

在开发中如果上传的文件过大,可以考虑分片上传,分片就是说将文件拆分来进行上传,将各个文件的切片传递给后台,然后后台再进行合并,下面这篇文章主要给大家介绍了关于利用Vue3+Element-plus实现大文件分片上传组件的相关资料,需要的朋友可以参考下
2023-01-28

使用fileupload组件实现文件上传功能

使用fileupload组件实现文件上传功能可以按照以下步骤进行:1. 导入相关文件和库:首先,需要导入jQuery库和fileupload插件的相关文件。```html```2. 创建HTML元素:创建一个文件上传的表单,并添加一个fil
2023-08-14

SpringBoot超大文件上传实现秒传功能

这篇文章主要介绍了SpringBoot超大文件上传实现秒传功能,在实现分片上传的过程,需要前端和后端配合,比如前后端的上传块号的文件大小,前后端必须得要一致,否则上传就会有问题,需要的朋友可以参考下
2022-12-10

Node.js怎么实现上传大文件功能

本篇内容主要讲解“Node.js怎么实现上传大文件功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js怎么实现上传大文件功能”吧!对于大文件的上传我们首先要引入一个叫做 multer
2023-07-04

SpringBoot实现文件上传下载功能小结

最近做的一个项目涉及到文件上传与下载。前端上传采用百度webUploader插件。有关该插件的使用方法还在研究中,日后整理再记录。本文主要介绍SpringBoot后台对文件上传与下载的处理。单文件上传// 单文件上传@RequestMapp
2023-05-31

如何使用fileupload组件实现文件上传功能

要使用fileupload组件实现文件上传功能,你需要进行以下步骤:1. 在HTML文件中,添加一个文件上传的input元素,设置type为file,并为其添加一个id属性,例如:``````2. 引入fileupload组件的相关库文件,
2023-08-14

编程热搜

目录