使用element-ui 的上传组件upload完成自定义上传到天翼云oss云服务器_包淼淼的博客-程序员秘密

技术标签: vue  

首先配置天翼云,如下操作

1、要求

在使用 OOS 之前,首先需要在 www.ctyun.cn 注册一个账号(Account)。 创建 AccessKeyId 和 AccessSecretKey。AccessKeyId 和 AccessSecretKey 是您访 问 OOS 的密钥,OOS 会通过它来验证您的资源请求,请妥善保管

2 使用方式

<!—引入本地资源-->
<script src="./oos-sdk-x.x.x.min.js"></script> 

使用 new OOS 创建 oos 对象 OOS JS-SDK 目前只支持异步请求方式,通过 callback 方式处理,对于 err 处理,非 err 显示处理结果。下图示例初始化到返回结果流程:

var client = new OOS.S3({...});
var params;
client.listObjects(params, function (err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});

3 CORS 配置

从浏览器中直接访问 OOS 需要开通 Bucket 的 CORS:

• 将 来源(*)设置成: *

• 将允许的方法(*)设置成: PUT, GET, POST, DELETE, HEAD

• 将允许的 Headers 设置成: *

• 将暴露的 Headers:设置成: ETag 注意:请将该条 CORS 规则设置成所有 CORS 规则的第一条

 

由于浏览器的同源策略,在浏览器里调用 JS-SDK 时, 部分功能无法实现,包括 Service 的 操作,Bucket 的新建,AccessKey 以及 SecretKey 的操作

4、options配置项

OOS options介绍

封装上传组件如下:

<template>
  <div :class="{exceed: isExceed}">
    <el-upload ref="upload" action="#" :http-request="httpRequest" :before-upload="beforeUpload"
      list-type="picture-card" :on-preview="handlePictureCardPreview" :file-list="fileList" :on-remove="handleRemove"
      v-bind="$attrs" :on-exceed="handleOnExceed" :on-success="handleOnSuccess" :on-change="onChangeFile">
      <i class="el-icon-plus"></i>
    </el-upload>
    <i v-if="bottomTip">{
   {bottomTip}}</i>
    <el-dialog :visible.sync="dialogVisible" append-to-body>
      <img width="100%" :src="dialogImageUrl">
    </el-dialog>
    <image-viewer :z-index="3000" v-if="showViewer" :on-close="closeViewer" :url-list="previewSrcList" />
  </div>
</template>
<script>
import imageViewer from 'element-ui/packages/image/src/image-viewer'
var Bucket = '********'
var accessKeyId = '********'
var secretAccessKey = '********'
var endPoint = 'oos-cn.ctyunapi.cn'
export default {
  name: 'd2-upload',
  components: { imageViewer },
  props: {
    value: {
      type: Array,
      default () {
        return []
      }
    },
    bottomTip: {
      type: String
    },
    removeAfterUpload: {
      type: Boolean,
      default () {
        return false
      }
    }
  },
  data () {
    return {
      fileList: [],
      uploadList: [], // 自定义的数组,用于处理fileList,fileList是只读的
      dialogImageUrl: '',
      dialogVisible: false,
      isInternal: false,
      isExceed: false,
      showViewer: false,
      previewSrcList: [],
      clent: null
    }
  },
  watch: {
    value: {
      handler (val) {
        if (!this.isInternal) {
          if (!this.uploadList.length) {
            this.fileList = val.map(item => {
              return {
                url: item
              }
            })
          }
          this.setIsExceed()
        } else {
          this.isInternal = false
        }
      },
      immediate: true
    }
  },
  methods: {
    // 选择上传文件,上传成功后都会出发
    onChangeFile (file, fileList) {
      this.fileList = fileList
      let index = this.fileList.findIndex(item => {
        return file.raw.response === item.raw.response
      })
      if (file.raw.response) {
        this.uploadList.splice(index, 0, file.raw.response)
        this.emitData(this.uploadList)
      }
    },
    async httpRequest (file) {
      await this.handleUpload(file.file)
    },
    handleUpload (file) {
      this.isInternal = true
      return new Promise((resolve, reject) => {
        let that = this
        var params = {
          Body: file,
          Bucket: Bucket,
          Key: file.name
        }
        that.client.putObject(params, function (err, data) {
          if (err) {
            console.log(err, err.stack) // an error occurred
            resolve(false)
            that.$message.error('上传失败')
          } else {
            file.response = 'https://' + endPoint + '/' + params.Bucket + '/' + params.Key
            that.$message.success('上传成功')
            that.isInternal = false
            resolve(true)
          }
        })
      })
    },
    initOss () {
      this.client = new OOS.S3({
        accessKeyId: accessKeyId,
        secretAccessKey: secretAccessKey,
        endpoint: endPoint,
        signatureVersion: 'v4', // 可选v2 或v4
        apiVersion: '2006-03-01',
        s3ForcePathStyle: true
      })
    },
    beforeUpload (file) {

    },
    handleOnExceed (file, fileList) {
      this.$message.warning('数量超出限制')
    },
    handleRemove (file, fileList) {
      let index = this.fileList.findIndex(item => {
        if (file.raw) {
          return file.raw.response === item.raw.response
        } else {
          return file.url === item.url
        }
      })
      this.uploadList.splice(index, 1)
      this.isInternal = true
      this.fileList = fileList
      this.emitData(this.uploadList)
      this.isExceed = false
    },
    handlePictureCardPreview (file) {
      this.previewSrcList = [file.raw.response]
      this.showViewer = true
    },
    handleOnSuccess (response, file, fileList) {
      this.fileList = fileList
      this.isInternal = true
      this.setIsExceed()
      if (this.removeAfterUpload) {
        this.$refs.upload.clearFiles()
        this.uploadList = []
      }
    },
    emitData (list) {
      this.$emit('input', list)
    },
    closeViewer () {
      this.showViewer = false
    },
    setIsExceed () {
      if (this.$attrs.limit && this.fileList.length >= this.$attrs.limit) {
        this.isExceed = true
      } else {
        this.isExceed = false
      }
    }
  },
  mounted () {
    this.initOss()
  }
}
</script>
<style scoped>
.exceed >>> .el-upload {
  display: none;
}
</style>

组件引用:

 <d2-upload v-model="form.uploaderUrlArray" :limit="5" accept=".png,.jpg,.jpeg" multiple />

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_32849999/article/details/110000814

智能推荐

ubuntu开机自动挂载硬盘_balllyp479310的博客-程序员秘密

1. 查看硬盘信息df -h命令找到目标硬盘(可根据 磁盘分区(路径)、分区大小、挂载点 确认/定位 目标)sudo blkid命令找到目标硬盘的UUID,(关注一下分区的格式化类型,如ext4、ntfs等)如下图,我需要自动挂载的4块硬盘:/dev/sdb 3.6T 437G 3.0T 13% /media/adm...

电信物联网开放平台_NB-IoT业务对接 Java 后台、Android 前端已完成预研_字母搬运工2000的博客-程序员秘密

电信物联网开放平台_NB-IoT业务对接 Java 后台、Android 前端已完成预研一、NB-IoT : 硬件设备 BC28模组 二、Java 后台: SSH集成电信物联SDK、极光推送SDK、Bootstrap 三、Android 前端: Android Studio 集成极光推送等 四、研发已到达预期效果 1、实现调用了电信物联南桥、北桥接口 2、...

laravel5.4以上版本的migrate迁移数据库创建表的过程_lucky.麒麟的博客-程序员秘密

首先在控制台进行laravel项目的路径下:PHP artisan migrate:install将会在数据库中创建migrations的数据表,用来记录迁移的数据表,用来同步创建数据表:PHP artisan make:migration create_posts_table这样将会在项目的database/migratios/2018_01_25

Jmeter接口压力测试【POST】接口_Immoralay的博客-程序员秘密

在上一篇文章中已经详细解释jmeter接口和压力测试,该文章主要详述【post】接口的参数传递方法1、post请求的入参是x-www-form-urlencoded格式的(1)填写HTTP请求相应信息和参数需要的参数(研发文档里会给)放在【Parameters】里(2)填写HTTP信息头管理器需要再信息头管理器加入Content-Type、若该post接口需要Cookie,则需要去抓取Cookie...

《算法竞赛入门经典》UVA272_DenisMe的博客-程序员秘密

《算法竞赛入门经典》UVA272题目题解Tips&amp;nbsp;题目InputInput will consist of several lines of text containing an even numberof double-quote (&quot;) characters. Input is ended with an end-of-filecharacter.OutputT...

C/C++引用_山人自有锦囊妙计的博客-程序员秘密

引用符号:&amp;,出现在类型之后Struct Object{ int value;};int main{ Object a={1}; Object&amp; r=a; return 0;}1、创建一个类型为Object的对象a,变量r是对象a的一个引用(总共只有一个对象,r只是对象a的一个别名),对r的访问就是对a的访问int a=12...

随便推点

android 随手记代码,随手记之Android网络调试简要记录_徐志鹄的博客-程序员秘密

最近一段时间,移动2G/3G客户端连接成功率不高,着实让人头疼。说是Android网络调试,其实也不过是在被ROOT后Android系统操作,使用adb shell执行一些常规的终端命令,检测2G/3G/4G/WIFI网络等,进而确定一些因网络等导致的问题而已。但adb shell默认没有几个支持的命令,比如 cat, tcpdump,这些都是最基本的必备命令,也不支持。对于想要查看网络请求有几次...

光纤收发器发展趋势_杭州飞畅的博客-程序员秘密

现如今,随着互联网的高速发展,以太网的局域发展已经无法适应其发展了,因此出现了光纤收发器这种设备,来进行长距离的光信号输送,这样可以扩大光网的使用范围,使更多的人能够受到网络的优惠和速度。接下来飞畅科技小编就来为大家详细介绍下光纤收发器的发展趋势,一起来看看吧!  随着光纤收发器产品不断的投入市场中,一直在进行不断的升级和完善过程中,因此有很多用户也对他提出了很多新的要求,对于这些新的要求就是光纤收发器在未来几个年里的发展趋势。  首先,光纤收发器产品还不够智能。举个例子,当光纤收发器的光路断掉后,

Matplotlib 绘图教程(3D)_安装mplot3d.art3d__dahu_的博客-程序员秘密

一、实验介绍1.1 实验内容Matplotlib 是支持 Python 语言的开源绘图库,因为其支持丰富的绘图类型、简单的绘图方式以及完善的接口文档,深受 Python 工程师、科研学者、数据工程师等各类人士的喜欢。这是 Matplotlib 绘图课程的第 3 章节,将带你了解 3D 图像绘制。1.2 实验知识点Matplotlib 绘制 3D 图像1.3

直观理解梯度,以及偏导数、方向导数和法向量等_shine-lee的博客-程序员秘密

title: 直观理解梯度,以及法向量和切平面mathjax: truedate: 2019-10-17 17:59:53tags:categories:博客:blog.shinelee.me | 博客园 | CSDN写在前面梯度是微积分中的基本概念,也是机器学习解优化问题经常使用的数学工具(梯度下降算法),虽然常说常听常见,但其细节、物理意义以及几何解释还是值得深挖一下,这些不...

python之pygame字体 图片 画图模块(三)_我要糖的博客-程序员秘密

在游戏中文字和图像一样重要,关系到我们的游戏体验,故我们需要知道字体和图像的产生以及我们如何产生我们期望的画面一、字体模块pygame.font.get_fonts()返回字符串列表,可获得我们当前系统的所有可用字体先介绍一个函数的用法my_font=pygame.font.Font("my_font.ttf",16)注意到使用了my_font.ttf这个语句,它可以把字体文件随游...

使用python计算夏普比率与最大回撤和最大回撤时间的程序_python 计算回撤天数_bartonpd的博客-程序员秘密

本程序为Ernest Chen所著Quantitative Trading中文版书中42页中例子,书中主要介绍了如何使用Excel和matlab来实现夏普比率与计算最大回撤和最大回撤时间的方法,python作为一种开源语言,能够实现matlab的相同功能,并能写交易程序,因此采用python实现了书中功能,作为练手#计算夏普率与回撤与回撤时间#第一次完成于2016/5/24import

推荐文章

热门文章

相关标签