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


Posted in Javascript onJuly 31, 2019

Element提供了upload上传组件,可以查看官网upload组件的详细介绍;查看upload组件的上传源码upload/ajax,使用的是XHR对象上传文件。在项目实践中,发现该上传方法上传大文件时会出现问题,所以决定使用阿里云对象存储服务(Object Storage Service,简称OSS),OSS详细介绍可以查看官网,本文主要讲解的是OSS上传文件的前端,后台开发请查看官网介绍,SDK Browser.js讲解了前端如何进行上传。

1、使用npm安装SDK的开发包:

npm install ali-oss

2、OSS配置

let OSS = require('ali-oss');
let client= new OSS.Wrapper({
 accessKeyId: 'your access key',
 accessKeySecret: 'your access secret',
 bucket: 'your bucket name',
 region: 'oss-cn-hangzhou'
});

最新版的没有了Wrapper构造函数,直接配置

let oss = require('ali-oss');
var client = oss({
 accessKeyId: 'your access key',
 accessKeySecret: 'your access secret',
 bucket: 'your bucket name',
 region: 'oss-cn-hangzhou'
});

3、上传文件

OSS上传文件分为上传Buffer内容、上传blob数据、分片上传,此处展示分片上传

let result = await client.multipartUpload('object-key', 'local-file', {
 progress: async function (p) {
 console.log('Progress: ' + p);
 }
 });

js调用OSS上传文件已经没有问题,但是我们需要实现公用上传组件,Element UI已经实现了Upload上传组件,包括上传进度、异常处理、拖拽等;那我们还有必要重新开发一个像Upload一样的组件吗?通过查看Upload组件的API发现有一个http-request属性,http-request覆盖默认的上传行为,可以自定义上传的实现;看到这个我就省了很多事,直接用OSS上传覆盖XHR上传。代码如下:

<template>
 <div>
 <el-upload
 :auto-upload="false"
 :action="uploadUrl"
 ref="upload"
 :before-upload="fnBeforeUpload"
 :on-success="fnUploadSuccess"
 :on-exceed="fnUploadExceed"
 :data="data_extra"
 :headers="uploadHeaders"
 :http-request="fnUploadRequest"
 drag
 :limit="files"
 :disabled="disabled"
 multiple>
 <i class="el-icon-upload"></i>
 <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
 <div slot="tip" class="el-upload__tip">上传文件大小不能超过 1G</div>
 </el-upload>
 </div>
</template>
<script>
import UploadFileApi from '@/api/system/UploadFileApi'
import * as util from 'utils/common'
import OSS from 'ali-oss'
export default {
 name: 'fileUpload',
 props: {
 data_extra: {
 type: Object,
 required: true
 },
 accept: {
 type: Array,
 required: true
 }
 },
 data () {
 return {
 uploadUrl: '',
 uploadFileLength: 0,
 uploadFileSuccess: 0,
 uploadFileNames: [],
 uploadFileName: [],
 fileList: [],
 files: 10,
 uploadHeaders: {
 authorization: ''
 },
 disabled: false
 }
 },
 methods: {
 /**
 * @description [fnUploadRequest 覆盖默认的上传行为,实现自定义上传]
 * @author shanshuizinong
 * @param {object} option [上传选项]
 * @return {null} [没有返回]
 */
 async fnUploadRequest (option) {
 try {
 let vm = this
 vm.disabled = true
 // 获取OSS配置信息
 let uploadFileApi = new UploadFileApi()
 let ret = await uploadFileApi.fileOssParams()
 if (!(ret.data && ret.data.code === '0' && ret.data.data)) {
  throw new Error('获取OSS参数失败')
 }
 let ossData = JSON.parse(ret.data.data)
 let relativePath = ossData.relativePath
 let client = new OSS.Wrapper({
  policy: ossData.policy,
  accessKeyId: ossData.accessid,
  accessKeySecret: ossData.accesssecret,
  bucket: ossData.bucket,
  signature: ossData.signature
 })
 let file = option.file
 const point = file.name.lastIndexOf('.')
 let suffix = file.name.substr(point)
 let fileName = file.name.substr(0, point)
 let date = vm.$moment().format('YYYYMMDDHHmm')
 let fileNames = `${fileName}_${date}${suffix}`
 // 分片上传文件
 ret = await client.multipartUpload(relativePath + fileNames, file, {
  progress: async function (p) {
  let e = {}
  e.percent = p * 100
  option.onProgress(e)
  }
 })
 console.log(ret)
 if (ret.res.statusCode === 200) {
  // option.onSuccess(ret)
  return ret
 } else {
  vm.disabled = false
  option.onError('上传失败')
 }
 } catch (error) {
 console.error(error)
 this.disabled = false
 option.onError('上传失败')
 this.$error(error.message)
 }
 },
 /**
 * @description [fnUploadSuccess 文件上传成功的函数]
 * @author shanshuizinong
 * @return {null} [没有返回]
 */
 async fnUploadSuccess () {
 // TODO
 }
 }
}
</script>

查看upload源码upload.vue知道httpRequest会有一个文件上传的option选项作为参数,upload/ajax源码中上传进度、上传成功、上传失败都是通过option调用其方法进行触发。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 学习笔记 Black.Caffeine 09.11.28
Nov 30 Javascript
ExtJs的Date格式字符代码
Dec 30 Javascript
js自动闭合html标签(自动补全html标记)
Oct 04 Javascript
jQuery插件制作之参数用法实例分析
Jun 01 Javascript
基于JS2Image实现圣诞树代码
Dec 24 Javascript
jquery判断对象是否为空并遍历对象的简单实例
Jul 26 Javascript
javascript观察者模式实现自动刷新效果
Sep 05 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
Mar 19 Javascript
Vue中使用sass实现换肤功能
Sep 07 Javascript
微信小程序实现滚动加载更多的代码
Dec 06 Javascript
vue实现短信验证码输入框
Apr 17 Javascript
JS如何实现封装列表右滑动删除收藏按钮
Jul 23 Javascript
原生js代码能实现call和bind吗
Jul 31 #Javascript
微信小程序下拉框搜索功能的实现方法
Jul 31 #Javascript
javascript中undefined的本质解析
Jul 31 #Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
Jul 31 #Javascript
vue 实现滚动到底部翻页效果(pc端)
Jul 31 #Javascript
js实现一个简易计算器
Mar 30 #Javascript
微信小程序iBeacon测距及稳定程序的实现解析
Jul 31 #Javascript
You might like
wiki-shan写的php在线加密的解密程序
2008/09/07 PHP
php中防止SQL注入的最佳解决方法
2013/04/25 PHP
TP5框架实现一次选择多张图片并预览的方法示例
2020/04/04 PHP
top.location.href 没有权限 解决方法
2008/08/05 Javascript
使用JQuery进行跨域请求
2010/01/25 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
浅谈jquery中的each方法$.each、this.each、$.fn.each
2016/06/23 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
js实现本地图片文件拖拽效果
2017/07/18 Javascript
实用的Vue开发技巧
2019/05/30 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
Python 专题一 函数的基础知识
2017/03/16 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
Python进阶之尾递归的用法实例
2018/01/31 Python
python+opencv识别图片中的圆形
2020/03/25 Python
使用Python开发SQLite代理服务器的方法
2018/12/07 Python
Python函数定义及传参方式详解(4种)
2019/03/18 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
英国最大的在线亚洲杂货店:Red Rickshaw
2020/03/22 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
学生出入校管理制度
2014/01/16 职场文书
优秀学生干部推荐材料
2014/02/03 职场文书
财产公证书格式
2014/04/10 职场文书
营销总监岗位职责
2014/09/16 职场文书
党员民主评议个人总结
2014/10/20 职场文书
餐厅收银员岗位职责
2015/04/07 职场文书
css实现文章分割线样式的多种方法总结
2021/04/21 HTML / CSS