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 相关文章推荐
DOM2非标准但却支持很好的几个属性小结
Jan 21 Javascript
js获取单选框或复选框值及操作
Dec 18 Javascript
node.js学习总结之调式代码的方法
Jun 25 Javascript
js父页面与子页面不同时显示的方法
Oct 16 Javascript
JavaScript中的对象继承关系
Aug 01 Javascript
AngularJS入门教程之Cookies读写操作示例
Nov 02 Javascript
jQuery插件FusionCharts绘制的2D条状图效果【附demo源码】
May 13 jQuery
BetterScroll 在移动端滚动场景的应用
Sep 18 Javascript
浅谈webpack 四个核心概念之Entry
Jun 12 Javascript
JS实现的碰撞检测与周期移动完整示例
Sep 02 Javascript
VueCli4项目配置反向代理proxy的方法步骤
May 17 Javascript
原生JavaScript写出Tabs标签页的实例代码
Jul 20 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
PHP模拟SQL Server的两个日期处理函数
2006/10/09 PHP
php轻量级的性能分析工具xhprof的安装使用
2015/08/12 PHP
PHP判断文件是否被引入的方法get_included_files用法示例
2016/11/29 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
Dom与浏览器兼容性说明
2010/10/25 Javascript
在IE和VB中支持png图片透明效果的实现方法(vb源码打包)
2011/04/01 Javascript
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
JS控件的生命周期介绍
2012/10/22 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
AngularJS 作用域详解及示例代码
2016/08/17 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
理顺8个版本vue的区别(小结)
2018/09/17 Javascript
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
node.js express框架实现文件上传与下载功能实例详解
2019/10/15 Javascript
微信小程序canvas分享海报功能
2019/10/31 Javascript
浅谈Vue static 静态资源路径 和 style问题
2020/11/07 Javascript
python基础教程之匿名函数lambda
2017/01/17 Python
对python 操作solr索引数据的实例详解
2018/12/07 Python
使用TensorFlow直接获取处理MNIST数据方式
2020/02/10 Python
使用Python+selenium实现第一个自动化测试脚本
2020/03/17 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
python BeautifulSoup库的安装与使用
2020/12/17 Python
好药师网上药店:安全合法的网上药品零售药房
2017/02/15 全球购物
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
Java程序员面试90题
2013/10/19 面试题
《藤野先生》教学反思
2014/02/19 职场文书
国培计划培训感言
2014/03/11 职场文书
安全保证书
2015/01/16 职场文书
违纪检讨书
2015/01/27 职场文书
关于召开会议的通知
2015/04/15 职场文书
《我是什么》教学反思
2016/02/16 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
分享Python异步爬取知乎热榜
2022/04/12 Python