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-CLI多页分目录打包的步骤记录

    下面就来详细讲解一下“Vue-CLI多页分目录打包的步骤记录”的完整攻略。 Vue-CLI多页分目录打包的背景 在Vue的开发中,通常会使用到Vue-CLI脚手架工具来快速创建一个Vue项目,但默认情况下Vue-CLI创建的是单页应用,而有些场景需要创建多页应用。多页应用指的是一个网站包含多个入口页面,并且每个入口页面处理不同的业务逻辑,这种情况下需要使用多…

    Vue 2023年5月28日
    00
  • vue如何将base64流数据转成pdf文件并在新页面打开

    下面是将base64流数据转成pdf文件并在新页面打开的详细攻略: 1. 将base64流数据转成blob数据 首先,需要在vue组件中定义一个方法,将base64流数据转成blob数据。 function base64ToBlob(base64Data, contentType) { contentType = contentType || ”; con…

    Vue 2023年5月27日
    00
  • 封装Vue Element的table表格组件的示例详解

    首先介绍一下Vue Element的table表格组件,它是基于Vue.js的易用的表格组件,能够快速方便地创建数据表格,支持分页、排序和多选等功能,并且形象直观地展示数据。 下面我们主要是介绍一下如何进行封装,以便更好地使用。 第一步,建立自己的table组件,将其封装进Vue组件中。 <template> <div> <el…

    Vue 2023年5月27日
    00
  • 在vue中created、mounted等方法使用小结

    在Vue中created、mounted等方法使用小结 Vue.js是一个基于MVVM模式的前端开发框架,它的核心是数据与视图的绑定,通过创建Vue实例,可以轻松地控制页面中的数据和DOM元素。在Vue.js中,生命周期钩子函数是非常重要的一部分,主要用于在Vue实例创建、挂载、更新、销毁等各个阶段进行逻辑处理,比如数据初始化、组件渲染、数据更新等。在这些生…

    Vue 2023年5月28日
    00
  • 浅谈vue中.vue文件解析流程

    在Vue中,.vue文件是一个自定义的组件格式,包含了一个完整的Vue组件,包括模板、样式和逻辑等内容。在这里,我们将详细讲解Vue中的.vue文件解析流程。 什么是.vue文件? .vue文件是一种自定义的组件格式,主要用于Vue项目中的组件开发。每个.vue文件都代表着一个完整的Vue组件,包括模板、样式和逻辑等部分。 .vue文件通常由三个部分组成: …

    Vue 2023年5月28日
    00
  • 详解Jest结合Vue-test-utils使用的初步实践

    下面我会详细讲解“详解Jest结合Vue-test-utils使用的初步实践”的完整攻略,并提供两个示例说明。 详解Jest结合Vue-test-utils使用的初步实践 简介 Jest是一个由Facebook开发的JavaScript测试框架,可以帮助我们编写高质量、可维护性强、易于扩展的测试代码。Vue-test-utils是一个用于Vue.js组件测试…

    Vue 2023年5月27日
    00
  • vuex新手进阶篇之取值

    下面是关于“Vuex新手进阶篇之取值”的完整攻略。 1. 什么是Vuex Vuex是一个专为Vue.js设计的状态管理架构,它采用集中式存储管理应用的所有组件的状态,可以轻松管理各个组件之间的状态共享。 2. 文章主题:Vuex的取值 在Vuex中,要取到状态(state)中的值,需要使用vuex提供的getters方法。 2.1 定义getters get…

    Vue 2023年5月27日
    00
  • vue axios用法教程详解

    Vue Axios用法教程详解 Vue.js是一个流行的JavaScript框架,用于构建交互式Web应用程序。Axios是一种常用的基于Promise的HTTP客户端,用于通过RESTful API发送HTTP请求。 本教程将详细介绍Vue Axios的用法,包括如何安装、设置和使用。 安装 安装Axios最简单的方法是使用npm,在命令行中运行以下命令:…

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