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

yizhihongxing

下面是“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开发自己的Chrome扩展程序过程详解

    使用Vue开发自己的Chrome扩展程序 开发Chrome扩展程序可以用于个性化配置Chrome浏览器功能,同时也是Chrome浏览器生态中非常重要的一部分。本篇文章将会向你详细讲解如何使用Vue开发自己的Chrome扩展程序。 准备工作 首先,需要安装最新版的Node.js和 Vue CLI工具。安装完成后,使用以下命令创建一个基于 Vue 的 Chrom…

    Vue 2023年5月27日
    00
  • Vue动态样式绑定实例详解

    下面我来详细讲解一下“Vue动态样式绑定实例详解”的完整攻略。 什么是Vue动态样式绑定 Vue动态样式绑定可以让我们根据Vue实例的数据来动态绑定一个或多个样式。这样,在数据改变时,与之相关联的样式也会随之改变,从而实现一个动态的页面。 如何使用Vue动态样式绑定 Vue动态样式绑定可以使用v-bind:style或:style指令来绑定一个或多个样式。它…

    Vue 2023年5月27日
    00
  • vue element实现将表格单行数据导出为excel格式流程详解

    下面是关于“vue element实现将表格单行数据导出为excel格式流程详解”的攻略,包含了完整的代码和实现流程。 1. 安装所需工具 首先,我们需要安装一些工具,包括: vue – 一个流行的JavaScript框架 element-ui – 一个基于vue的UI组件框架 xlsx – 一个用于处理Excel文件的JavaScript库 你可以使用以下…

    Vue 2023年5月27日
    00
  • vue和js中实现模糊查询方式

    下面给出实现模糊查询方式的完整攻略。 一、实现原理 要想实现模糊查询,需要的是对输入的关键字进行处理,将其与数据源进行匹配。可以利用JS的字符串操作方法来进行模糊匹配,例如使用indexOf方法来判断一个字符串中是否含有某个子串,如果存在,则匹配成功,可以将其作为搜索结果之一。 在Vue中,我们可以利用计算属性来实现模糊查询的应用逻辑,当数据源或者输入的关键…

    Vue 2023年5月27日
    00
  • Vue 2中ref属性的使用方法及注意事项

    Vue 2中的ref属性是一个非常有用的功能,可以用来在Veu实例中访问组件、元素或子组件。以下是关于Vue 2中ref属性的使用方法及注意事项的攻略。 什么是ref属性 ref是Vue提供的一个属性,可以用来在Vue实例中设置、组件或元素的标识,通过这个标识可以直接在Vue实例中访问相应的实例或元素。 ref属性的使用方法 在Vue模板中使用ref属性需要…

    Vue 2023年5月28日
    00
  • vue3中组件传值的多种方法总结

    下面是详细讲解“vue3中组件传值的多种方法总结”的完整攻略。 1. 组件传值概述 在vue3中,组件传值是非常常见的场景,通常包括父组件向子组件传值和子组件向父组件传值两种类型。 在vue3中,组件传值的方式主要包括如下几种: 父组件向子组件传值(prop) 子组件向父组件传值($emit) 祖先组件向后代组件传值(provide/inject) 跨级组件…

    Vue 2023年5月29日
    00
  • Vue前端打包的详细流程

    Vue前端打包的详细流程包括:安装依赖、配置打包目录、启动打包、测试打包。 安装依赖 在进行Vue前端打包之前,需要先安装相关的依赖。首先需要安装Node.js和npm,使用类Unix系统(如macOS、Linux)的用户可以通过终端运行以下命令安装: sudo apt-get install nodejs sudo apt-get install npm …

    Vue 2023年5月28日
    00
  • 详解vue项目打包步骤

    下面是详解Vue项目打包步骤的完整攻略: 简介 在开发 Vue.js 项目的过程中,我们需要将代码打包并将它们部署到服务器上。Vue.js 提供了一些工具来帮助我们完成打包流程,并且支持多种打包方式,包括将整个项目打包成一个文件或将项目中的组件打包成单独的文件。 打包步骤 Vue.js 项目的打包流程大致分为以下几步: 1. 安装 Vue CLI Vue C…

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