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

让我来详细讲解一下“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日

相关文章

  • js中less常用的方法小结

    JS中Less常用的方法小结 1. Less和CSS变量 我们都知道,CSS中 var() 函数是用来引用自定义变量的。在Less中,我们可以使用和CSS类似的方式来定义和使用变量。下面是Less的变量定义示例: @base-color: #666; body { color: @base-color; background-color: lighten(@…

    Vue 2023年5月28日
    00
  • vue.js获取数据库数据实例代码

    以下是详细讲解“vue.js获取数据库数据实例代码”的完整攻略: 1. 使用Axios获取数据库数据的示例 在vue.js中使用Axios获取数据库数据是比较常见的方法。以下是代码示例: <template> <div> <!– 数据列表展示 –> <table> <thead> <tr&…

    Vue 2023年5月28日
    00
  • vue组件打包并发布到npm的全过程

    下面是Vue组件打包并发布到npm的全过程: 第一步:创建Vue组件项目 首先,我们需要创建一个Vue组件项目,可以使用Vue CLI来创建项目。具体步骤如下: 打开命令行工具,并输入以下命令来安装Vue CLI: npm install -g @vue/cli 接着,在指定的目录下运行以下命令来创建一个Vue组件项目: vue create your-pr…

    Vue 2023年5月28日
    00
  • Vue.component的属性说明

    下面详细讲解一下Vue中的组件属性说明。 Vue.component的属性说明 在Vue中,组件的一些常用属性可以用Vue.component进行定义。下面是Vue.component的主要属性说明: props props属性用于接收父组件传递过来的数据,在组件内部通过 this.$props 访问。它是一个数组或对象,数组中的元素可以是字符串或对象。如果…

    Vue 2023年5月27日
    00
  • Vue手机号正则匹配姓名加密展示功能的实现

    实现Vue手机号正则匹配姓名加密展示功能的步骤如下: 1. 编写Vue组件 首先,我们需要编写Vue组件来实现手机号的正则匹配和姓名的加密功能。在组件中,我们可以使用Vue的computed属性来实现数据的计算和展示。具体代码示例如下: <template> <div> <input v-model="phone&qu…

    Vue 2023年5月27日
    00
  • 10分钟了解Vue3递归组件的用法

    10分钟了解Vue3递归组件的用法 递归组件在前端开发中常用于处理层级比较深的数据结构。Vue3提供了一些新的特性,让递归组件的实现更加简单易用。 递归组件是什么? 递归组件是指一个组件可以在它的模板中调用自己。这种组件通常用于处理树形结构或列表的情况。 实现递归组件的步骤 在Vue3中,实现递归组件需要 following 步骤: 创建组件; 在组件的 t…

    Vue 2023年5月27日
    00
  • Vue实现文件批量打包压缩下载

    讲解”Vue实现文件批量打包压缩下载”的完整攻略。 一、问题描述 在Vue项目中,我们有时需要将多个文件打包成一个压缩文件并提供下载。那么如何使用Vue来实现这个需求呢? 二、解决方案 我们可以使用JSZip和FileSaver.js这两个库来实现此功能。 2.1 安装依赖 首先需要安装的是 jszip 和 file-saver: npm install j…

    Vue 2023年5月28日
    00
  • vuejs实现ready函数加载完之后执行某个函数的方法

    Vue.js是一种流行的JavaScript框架,用于构建高度可交互的页面。实现在Vue.js的ready函数加载完之后执行某个函数的方法比较简单,以下是详细攻略: 在Vue.js的实例化中定义“mounted”生命周期钩子函数。这个函数会在Vue.js的实例化加载到DOM之后立即执行,因此是最佳场所来执行要在Vue.js的ready函数之后执行的函数。例如…

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