Vue Element UI + OSS实现上传文件功能

下面是“Vue Element UI + OSS实现上传文件功能”的完整攻略。

准备工作

1.安装Vue CLI并创建Vue项目。

2.引入Element UI和Aliyun OSS SDK。

<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Vue Element UI + OSS实现上传文件功能</title>
  </head>
  <body>
    <div id="app"></div>
    <!-- 引入Element UI -->
    <link rel="stylesheet" href="//unpkg.com/element-ui/lib/theme-chalk/index.css">
  </body>
  <script src="/static/js/oss-sdk.js"></script>
  <script src="//cdn.bootcss.com/vue/2.2.2/vue.min.js"></script>
  <script src="//unpkg.com/element-ui/lib/index.js"></script>
  <script src="./app.js"></script>
</html>

3.编写初始化OSS控制台信息的方法。

// app.js
const OSS = require('ali-oss').Wrapper;

Vue.prototype.$osssts = {
  region: '',
  accessKeyId: '',
  accessKeySecret: '',
  bucket: '',
  stsToken: '',
  expiration: '',
};

Vue.prototype.$ossClient = {};

Vue.prototype.$initOss = function () {
  let self = this;
  this.$http.get('/api/sts').then(response => {
    if (response.status === 200 && response.data.Code === 'Success') {
      let data = response.data;
      self.$osssts.accessKeyId = data.AccessKeyId;
      self.$osssts.accessKeySecret = data.AccessKeySecret;
      self.$osssts.securityToken = data.SecurityToken;
      self.$osssts.expiration = data.Expiration;
      self.$osssts.region = self.$configStore.get('oss.region');
      self.$osssts.bucket = self.$configStore.get('oss.bucket');
      self.$ossClient = new OSS({
        region: self.$osssts.region,
        accessKeyId: self.$osssts.accessKeyId,
        accessKeySecret: self.$osssts.accessKeySecret,
        stsToken: self.$osssts.securityToken,
        bucket: self.$osssts.bucket
      });
    }
  })
}

Element-Ui Upload 组件的使用

Element-Ui提供了Upload组件,可以非常方便地实现文件上传功能。

使用vue-cli安装 Element UI

npm install element-ui --save

引入Upload组件

<!--index.html-->
<div id="app">
  <el-upload
    class="upload-demo"
    action="//jsonplaceholder.typicode.com/posts/"
    :on-preview="handlePreview"
    :on-remove="handleRemove"
    :on-success="handleSuccess"
    :on-error="handleError"
    :before-upload="beforeUpload">
    <el-button size="small" type="primary">点击上传</el-button>
    <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
  </el-upload>
</div>

配置actions

action属性是上传的接收地址,这里我们需要将其配置到OSS上。

<!--index.html-->
<template>
  <div id="app">
    <el-upload
      class="upload-demo"
      :action="$ossClient.signatureUrl('test/image')"
      :on-success="handleSuccess"
    >
      <el-button size="small" type="primary">点击上传</el-button>
      <div slot="tip" class="el-upload__tip">只能上传jpg/png文件...</div>
    </el-upload>
  </div>
</template>

调用OSS相关API实现上传功能

上传文件

// app.js
Vue.prototype.$uploadOss = function (file, options = {}) {
  let ext = file.name.substr(file.name.lastIndexOf('.'));
  let storeName = options.storeName || Date.now().toString() + ext;
  return Promise.all([
    this.$ossClient.put(storeName, file),
    Promise.resolve(storeName),
    this.$configStore.get('oss.url') + '/' + storeName,
  ]);
};

删除文件

// app.js
Vue.prototype.$removeOss = function (key) {
  return this.$ossClient.delete(key);
};

完整示例

<!--index.html-->
<template>
  <div id="app">
    <el-upload
      class="upload-demo"
      :action="$ossClient.signatureUrl('test/image')"
      :on-success="handleSuccess"
    >
      <el-button size="small" type="primary">点击上传</el-button>
      <div slot="tip" class="el-upload__tip">只能上传jpg/png文件...</div>
    </el-upload>
    <el-table
      style="width: 100%;"
      :data="fileList"
      border
      v-loading="loading"
      :default-sort="sortObj"
      height="500"
      @sort-change="handleSortChange">
      <el-table-column fixed="left" label="文件名" width="200">
        <template slot-scope="{ row }">
          <a :href="$configStore.get('oss.url')+'/'+row.storeName">{{row.storeName}}</a>
        </template>
      </el-table-column>
      <el-table-column fixed="left" prop="fileSize" label="文件大小" width="100">
        <template slot-scope="{ row }">
          {{(row.fileSize/1024).toFixed(2)}} K
        </template>
      </el-table-column>
      <el-table-column prop="lastModified" label="上传时间" width="150" sortable>
        <template slot-scope="{ row }">
          {{ dateFormat(row.lastModified) }}
        </template>
      </el-table-column>
      <el-table-column label="操作" width="150" fixed="right">
        <template scope="scope">
          <el-button type="danger" size="mini" :loading="scope.row.loading" @click="removeFile(scope.row, scope.$index)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>

<script>
  export default {
    name: 'app',
    data () {
      return {
        loading: false,
        fileList: [],
        sortObj: {
          prop: 'lastModified',
          order: 'descending'
        }
      }
    },
    created () {
      this.$initOss();
      this.getFileList();
    },
    computed: {
      $fileStore () {
        return this.$store.state.files;
      }
    },
    methods: {
      handleSuccess (response, file, fileList) {
        if (response.res.status === 200) {
          let file = {
            storeName: response.name,
            fileSize: file.size,
            fileExtension: file.name.replace(/.*\./, ''),
            lastModified: Date.now()
          };
          this.addFile(file);
        } else {
          this.$message.error('上传失败!');
        }
      },
      addFile (file) {
        this.$fileStore.addFile(file).then(data => {
          this.getFileList();
        });
      },
      getFileList () {
        this.loading = true;
        let self = this;
        this.$fileStore.getFileList().then(data => {
          self.fileList = data;
          self.loading = false;
        });
      },
      removeFile (file, index) {
        this.$fileStore.removeFile(file).then(() => {
          this.fileList.splice(index, 1);
        });
      },
      dateFormat (timestamp) {
        let date = new Date(timestamp);
        let year = date.getFullYear();
        let month = date.getMonth() + 1;
        let day = date.getDate();
        let hours = date.getHours();
        let minute = date.getMinutes();
        let second = date.getSeconds();
        return `${year}-${month}-${day} ${hours}:${minute}:${second}`;
      },
      handleSortChange ({ prop, order }) {
        this.fileList.sort((a, b) => {
          let valueA = a[prop];
          let valueB = b[prop];
          if (order === 'descending') {
            return valueB - valueA;
          } else {
            return valueA - valueB;
          }
        })
      }
    }
  }
</script>

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue Element UI + OSS实现上传文件功能 - Python技术站

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

相关文章

  • vue指令 v-bind的使用和注意需要注意的点

    下面是关于“vue指令 v-bind的使用和注意需要注意的点”的完整攻略。 1. vue指令 v-bind的使用 v-bind指令用于动态绑定html属性或Vue组件的属性。它的语法是 v-bind:属性名 或者简写成:属性名,例如: <template> <div> <a v-bind:href="url"…

    Vue 2023年5月27日
    00
  • vue el-date-picker 日期回显后无法改变问题解决

    对于“vue el-date-picker 日期回显后无法改变问题解决”的完整攻略,可以分为以下几个步骤: 步骤 1:引入 el-date-picker 组件 首先,在组件中引入 el-date-picker 组件: <el-date-picker v-model="date" type="date">&l…

    Vue 2023年5月29日
    00
  • 详解如何搭建mpvue框架搭配vant组件库的小程序项目

    下面是详解如何搭建mpvue框架搭配vant组件库的小程序项目的完整攻略。 步骤1:准备工作 在开始搭建之前,我们需要准备以下工具和环境: Node.js LTS版本 mpvue-cli脚手架工具 Vant Weapp组件库 如果你已经安装好了Node.js和mpvue-cli,可以直接通过以下命令安装Vant Weapp: npm i vant-weapp…

    Vue 2023年5月27日
    00
  • 利用Vue实现一个markdown编辑器实例代码

    下面是使用Vue实现一个markdown编辑器的完整攻略,包含以下步骤: 一、创建Vue项目并安装必要的依赖 (示例代码一) 首先,在命令行中进入项目目录,使用以下命令创建一个Vue项目: vue create markdown-editor 然后进入该项目的目录,使用以下命令安装必要的依赖: npm install marked vue-markdown-…

    Vue 2023年5月27日
    00
  • vue props数据传递类型限制方式

    Vue中的props是一种用于父子组件之间传递数据的机制。为了保证数据的正确性和可维护性,我们可以通过对props进行数据传递类型限制方式来限制传递的数据类型,以确保数据能够按照我们的预期运行。 在Vue中,我们可以通过拥有以下数据类型的props: String Number Boolean Array Object Date Function 其中,Ar…

    Vue 2023年5月27日
    00
  • Python3.10接入ChatGPT实现逐句回答流式返回

    下面是详细的攻略: 1. 概述 ChatGPT是一个基于深度学习技术的自然语言处理工具,可以进行对话生成、文本摘要等任务。而Python 3.10是Python编程语言的最新版本,有很多新增功能和改进。本教程将介绍如何使用Python 3.10接入ChatGPT,实现逐句回答并流式返回。 2. 准备工作 在开始之前,需要进行以下准备工作: 2.1 安装Pyt…

    Vue 2023年5月28日
    00
  • vue-cli3环境变量与分环境打包的方法示例

    下面是关于“vue-cli3环境变量与分环境打包的方法示例”的详细说明: 什么是环境变量? 在编写前端代码时,我们常常会遇到需要在不同的环境(如开发环境、测试环境、生产环境)使用不同的配置的情况,比如不同的 API 地址、不同的请求路径等等。这时我们就需要使用环境变量来解决这个问题。 环境变量是一种全局可用的变量,可以在应用程序的任何地方访问它们,不仅如此,…

    Vue 2023年5月27日
    00
  • Vue格式化数据后切换页面出现NaN问题及解决

    Vue格式化数据后切换页面出现NaN问题是一个常见的问题,这通常是由于数据类型不一致造成的。下面将为大家提供一份完整的攻略,帮助大家解决这个问题。 问题描述 在Vue中,你可能会遇到这样的情况:你在页面初始化时通过某种方式将数据格式化,但是当你切换页面时,你会发现数据变成了NaN。这是一个非常困扰人的问题,但是却很容易解决。 解决方案 1. 数据类型判断与转…

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