vue+element+oss实现前端分片上传和断点续传

yizhihongxing

让我来详细讲解一下“vue+element+oss实现前端分片上传和断点续传”的完整攻略。

前置知识

在开始之前,我们需要确保您已经掌握以下技能:

  • vue.js框架
  • element-ui组件库
  • Javascript
  • 阿里云OSS

准备工作

在开始项目之前,您需要准备以下工具:

  • npm包管理器
  • vue-cli脚手架

项目搭建

首先,我们需要使用vue-cli创建一个新的vue项目,您可以在终端中运行以下代码:

vue create my-project

接着,安装element-ui依赖:

npm install element-ui -S

安装阿里云OSS依赖:

npm install ali-oss -S

分片上传实现

分片上传的原理是将一个大文件分割成多个小文件,然后逐一上传。以下是示例代码:

<template>
  <div class="chunk-upload">
    <el-upload :action="action" :before-upload="beforeUpload" :on-change="changeFileList">
      <el-button size="small" type="primary">
        点击上传文件
      </el-button>
    </el-upload>
  </div>
</template>

<script>
import oss from 'ali-oss';

export default {
  data() {
    return {
      action: 'your-upload-url', //上传接口
      file: null,
      sliceSize: 2 * 1024 * 1024, //切片大小
      threadsNum: 4 //同时上传的切片数量
    };
  },
  methods: {
    async beforeUpload(file) {
      this.file = file;
    },
    async changeFileList(fileList) {
      if (fileList.length == 0) return;
      const client = oss({
        region: 'your-region', //OSS所在区域
        accessKeyId: 'your-access-key-id',
        accessKeySecret: 'your-access-key-secret',
        bucket: 'your-bucket-name',
        secure: true //如果是SSL连接,值为true
      });
      const fileName = this.file.name;
      let sliceStart = 0;
      const fileSize = this.file.size;
      let chunks = [];
      while (sliceStart < fileSize) {
        const sliceEnd = Math.min(sliceStart + this.sliceSize, fileSize);
        const slice = this.file.slice(sliceStart, sliceEnd);
        chunks.push(slice);
        sliceStart += this.sliceSize;
      }
      const headers = {
        'x-oss-object-acl': 'public-read'
      };
      const uploadRes = await client.multipartUpload(fileName, chunks, {
        headers,
        partSize: this.sliceSize,
        parallel: this.threadsNum
      });
      console.log(uploadRes);
    }
  }
};
</script>

<style>
.chunk-upload {
  width: 80%;
  margin: 40px auto;
  padding: 24px;
  border: 1px solid #eee;
  border-radius: 4px;
}
</style>

在上面的代码中,您需要将action替换成您的上传接口地址。执行UPLOAD的函数是changeFileList, 它将文件分割成若干个切片,并将它们上传到OSS,最后使用multipartUpload函数将所有部分组合在一起。在multipartUpload函数中,您需要指定每个部分的大小和同时上传的部分数目。

断点续传实现

断点续传是指在上传大文件时,可以在中途停止上传,然后从上次停止的位置继续上传。以下是示例代码:

<template>
  <div class="resume-upload">
    <el-upload :action="action" :before-upload="beforeUpload" :on-progress="onProgress" :on-success="onSuccess">
      <el-button size="small" type="primary">
        点击上传文件
      </el-button>
    </el-upload>
    <el-progress :percentage="progress" :color="progressColor" :stroke-width="10" :text-inside="true" />
  </div>
</template>

<script>
import OSS from 'ali-oss';

export default {
  data() {
    return {
      action: 'your-upload-url',
      file: null,
      client: null,
      progress: 0,
      lastLoaded: 0,
      chunkSize: 2 * 1024 * 1024, //切片大小
      progressColor: '#66CCFF' //进度条颜色
    };
  },
  methods: {
    async beforeUpload(file) {
      this.file = file;
      //初始化OSS客户端
      this.client = new OSS({
        region: 'your-region',
        accessKeyId: 'your-access-key-id',
        accessKeySecret: 'your-access-key-secret',
        bucket: 'your-bucket-name',
        secure: true
      });
    },
    async uploadPart(uploadId, index, chunk) {
      const result = await this.client.uploadPart(this.file.name, uploadId, index, chunk, {
        progress: async (p) => {
          p = p * 100 >> 0;
          if (p > this.progress) {
            this.progress = p;
          }
        },
        meta: {
          'x-oss-object-acl': 'public-read'
        }
      });
      return result;
    },
    async createUploadId() {
      const res = await this.client.initiateMultipartUpload(this.file.name, {
        meta: {
          'x-oss-object-acl': 'public-read'
        }
      });
      return res.uploadId;
    },
    async completeUpload(uploadId, etags) {
      const res = await this.client.completeMultipartUpload(this.file.name, uploadId, etags, {
        meta: {
          'x-oss-object-acl': 'public-read'
        }
      });
      return res;
    },
    async upload() {
      const fileSize = this.file.size;
      const chunkCount = Math.ceil(fileSize / this.chunkSize);
      let uploadId;
      let etags = new Array(chunkCount);
      const fileName = this.file.name;
      try {
        uploadId = await this.createUploadId();
        for (let i = 0; i < chunkCount; i++) {
          const start = i * this.chunkSize;
          const end = Math.min(start + this.chunkSize, fileSize);
          const chunk = this.file.slice(start, end);
          const result = await this.uploadPart(uploadId, i + 1, chunk);
          etags[i] = {
            PartNumber: i + 1,
            ETag: result.res.headers.etag
          };
          this.lastLoaded = end;
        }
        await this.completeUpload(uploadId, etags);
        console.log('断点续传成功');
      } catch (err) {
        console.log(err);
      }
    },
    async onProgress(event) {
      const loaded = event.loaded + this.lastLoaded;
      const total = this.file.size;
      if (total > 0) {
        this.progress = (loaded / total * 100) >> 0;
      }
    },
    async onSuccess() {
      await this.upload();
    }
  }
};
</script>

<style>
.resume-upload {
  width: 80%;
  margin: 40px auto;
  padding: 24px;
  border: 1px solid #eee;
  border-radius: 4px;
}
</style>

在上面的代码中,您需要将action替换为您的上传接口地址。断点续传函数是upload。在该函数中,我们将文件切成若干部分,并将它们逐一上传,记录上传队列的ETags。如果有任何一个部分上传失败,使用该函数的catch语句回滚操作。参考以上代码,加入自己的项目中可完成前端分片上传和断点续传。

这就是“vue+element+oss实现前端分片上传和断点续传”的完整攻略。希望本文能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue+element+oss实现前端分片上传和断点续传 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue组件与Vue cli脚手架安装方法超详细讲解

    下面是详细讲解“Vue组件与Vue cli脚手架安装方法超详细讲解”的完整攻略。 Vue组件与Vue cli脚手架安装方法超详细讲解 什么是Vue组件 Vue组件是构成Vue应用的基础,Vue应用中所有的元素都是由Vue组件构成的。组件可以是页面上的一个功能块,也可以是多个功能块的集合。 如何创建Vue组件 创建Vue组件的方式有两种,一种是使用Vue.js…

    Vue 2023年5月28日
    00
  • 分享Vue组件传值的几种常用方式(一)

    下面我会详细讲解“分享Vue组件传值的几种常用方式(一)”的完整攻略。 标题分析 标题:“分享Vue组件传值的几种常用方式(一)” 分析:该标题属于文档类文章,主要内容是针对Vue组件传值方面的一些常用方式进行介绍。 文章结构 引言:介绍Vue组件传值的重要性和文章将要介绍的内容。 父组件向子组件传值的方式: props属性 和 \$emit方法 对prop…

    Vue 2023年5月27日
    00
  • vue 数据遍历筛选 过滤 排序的应用操作

    关于Vue数据的遍历、筛选、过滤以及排序操作,我可以提供如下的完整攻略: 1. 使用v-for进行数据遍历 在Vue中,使用v-for指令可以方便地进行数据遍历,例如: <ul> <li v-for="item in items">{{item}}</li> </ul> 这个例子中,我们使用…

    Vue 2023年5月28日
    00
  • 如何解决ElementPlus的el-table底白线问题

    解决Element Plus的el-table底白线问题可以通过修改CSS样式来完成。步骤如下: 第一步:查看el-table的底部样式 通过浏览器的开发者工具,可以查看到el-table的底部样式,它的CSS类名是.el-table__body-wrapper::after。默认情况下,该样式设置了一个底部白线,并且高度为1像素,颜色为#e4e7ed。 第…

    Vue 2023年5月28日
    00
  • vue实现简单转盘抽奖功能

    下面我来详细讲解如何用vue实现简单转盘抽奖功能的完整攻略: 1. 搭建项目 首先我们需要使用vue-cli来搭建一个vue项目,输入以下命令来创建一个新的vue项目: vue create lottery 安装依赖,进入项目目录并启动本地服务器: cd lottery npm install npm run serve 2. 编写转盘组件 接下来我们需要编…

    Vue 2023年5月27日
    00
  • 深入理解vue路由的使用

    深入理解 Vue 路由的使用 Vue 的路由是一个非常重要的特性,可以方便地实现单页面应用(SPA),而不需要页面刷新。本文将介绍如何使用 Vue 路由,包括路由的基本使用、动态路由、嵌套路由和路由钩子函数等内容。 基本用法 首先,你需要安装 vue-router 插件: npm install vue-router 然后,在 Vue 项目中使用路由,需要在…

    Vue 2023年5月27日
    00
  • vue.js删除列表中的一行

    关于“vue.js删除列表中的一行”的完整攻略,可以分为以下几个步骤: 1. 在Vue中渲染列表 首先,在Vue中渲染出需要删除行的列表。在这个例子中,我们将使用v-for指令循环渲染一个列表,并为每个列表项添加一个删除按钮。 <template> <div> <ul> <li v-for="(item, …

    Vue 2023年5月29日
    00
  • Vue中的components组件与props的使用解读

    我将为你详细讲解“Vue中的components组件与props的使用解读”的完整攻略。 什么是Vue中的Components组件? 在Vue中,Components组件是由一些代码块组成的独立实体,它可以被单独使用,也可以被多次重复使用。通过组合构建Vue的组件树,可以实现高效、灵活的开发。 一个Vue组件通常包括三个部分: 模板:用于定义组件的结构,样式…

    Vue 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部