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日

相关文章

  • 使用vue实现各类弹出框组件

    使用vue实现各类弹出框组件需要遵循以下步骤: 步骤一:创建全局的Vue组件 首先,我们需要创建一个全局的Vue组件,该组件用于渲染弹出框,并设置如下属性: v-show: 用于控制组件的显隐状态 title: 弹出框的标题 width: 弹出框的宽度 height: 弹出框的高度 ok: 点击“确认”按钮时的回调函数 cancel: 点击“取消”按钮时的回…

    Vue 2023年5月28日
    00
  • Vue项目部署上线全过程记录(保姆级教程)

    非常感谢您对Vue项目上线过程的关注。以下是我整理的“Vue项目部署上线全过程记录(保姆级教程)”的详细攻略。 确认服务器环境在开始之前,请确保您已经购买了云服务器,在服务器上安装好操作系统和需要的软件环境。推荐使用Linux系统,并保证服务器具备如下配置: 操作系统:CentOS 7/Ubuntu 14.04及以上版本; CPU:1核及以上; 内存:2GB…

    Vue 2023年5月28日
    00
  • Vue数据更新但页面没有更新的多种情况问题及解决

    问题描述: 在使用Vue时,我们发现有些时候,数据更新了,但页面并没有及时更新,这是一个非常常见的问题。 解决方案: 异步更新问题 当我们使用Vue异步更新数据时,如果不使用vm.$nextTick(),数据更新之后页面并不会立刻进行更新。 例如,在下面这个例子中,我们在点击按钮之后更新了msg的值,但是页面上的内容并没有更新。 <template&g…

    Vue 2023年5月27日
    00
  • 八个Vue中常用的v指令详解

    接下来我会详细讲解”八个Vue中常用的v指令”的完整攻略。这篇攻略会包含v-bind、v-model、v-if、v-for、v-on、v-show、v-text、v-html这八个指令的详解和示例说明。 v-bind v-bind指令用于在HTML标签中动态绑定数据。它可以将data中定义的数据绑定到HTML标签上的属性中,例如链接地址、图片src等。示例代…

    Vue 2023年5月27日
    00
  • 如何手写一个简易的 Vuex

    首先,我们需要明确什么是 Vuex, Vuex 是 Vue.js 应用程序的状态管理模式,它采用集中式存储管理应用的所有组件的状态,我们可以将这个状态类比一个容器,这个容器里保存着整个应用的状态,而组件只能通过事件的形式来修改这个容器中的状态。下面我们来讲解手写一个简易的 Vuex 的过程。 步骤一:实现 store 在 Vuex 中,我们通过创建一个 St…

    Vue 2023年5月27日
    00
  • vue实现pdf文档在线预览功能

    下面是详细的讲解“vue实现pdf文档在线预览功能”的完整攻略: 确认需求 在开始实现在线预览PDF文档的功能之前,我们需要确定需求。在本节中,我们需要考虑以下问题: 我们将使用哪个PDF库来解析和显示PDF文档? 我们将如何将PDF文档加载到我们的Vue应用程序中? 我们将如何实现PDF文档的渲染和导航? 选择PDF库 在Vue应用程序中实现PDF预览功能…

    Vue 2023年5月28日
    00
  • Vue路由vue-router用法讲解

    首先需要明确的是Vue Router是Vue.js官方的路由管理器,用于实现单页应用(SPA)的路由功能。下面我将详细讲解Vue Router的用法。 一、Vue Router的基本使用 1. 安装 使用Vue Router需要先安装它。可以通过以下命令行安装最新版本的Vue Router: npm install vue-router 安装完成后,在需要使…

    Vue 2023年5月27日
    00
  • Vue3源码分析组件挂载创建虚拟节点

    下面是关于Vue3源码分析组件挂载创建虚拟节点的完整攻略。 什么是组件挂载 组件挂载是指在Vue生命周期的beforeMount阶段,组件实例被创建后,将组件的模板解析成虚拟DOM并挂载到指定的DOM元素上的过程。在Vue实现组件挂载的过程中,重要的一步是通过编译器将组件模板解析成渲染函数,进而通过渲染函数创建虚拟节点。 Vue3组件挂载的实现过程 在Vue…

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