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 相关文章推荐
js和jquery对dom节点的操作(创建/追加)
Apr 21 Javascript
快速查找数组中的某个元素并返回下标示例
Sep 03 Javascript
html的DOM中document对象forms集合用法实例
Jan 21 Javascript
浅谈javascript中的闭包
May 13 Javascript
jQuery常用知识点总结以及平时封装常用函数
Feb 23 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
Jan 15 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
Aug 16 Javascript
使用Vue开发动态刷新Echarts组件的教程详解
Mar 22 Javascript
详解angular2如何手动点击特定元素上的点击事件
Oct 16 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
Apr 10 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
Jan 16 Javascript
vue循环中点击选中再点击取消(单选)的实现
Sep 10 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数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
2014/10/26 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
客户端静态页面玩分页
2006/06/26 Javascript
JavaScript的parseInt 进制问题
2009/05/07 Javascript
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
ExtJS4 组件化编程,动态加载,面向对象,Direct
2011/05/12 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
vue实现样式之间的切换及vue动态样式的实现方法
2017/12/19 Javascript
jQuery实现的点击显示隐藏下拉菜单功能完整示例
2019/05/17 jQuery
vue项目中实现缓存的最佳方案详解
2019/07/11 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
[06:45]DOTA2-DPC中国联赛 正赛 Magma vs LBZS 选手采访
2021/03/11 DOTA
使用python和Django完成博客数据库的迁移方法
2018/01/05 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
Python中format()格式输出全解
2019/04/12 Python
Pytorch的mean和std调查实例
2020/01/02 Python
Python PyInstaller安装和使用教程详解
2020/01/08 Python
如何将json数据转换为python数据
2020/09/04 Python
Anaconda使用IDLE的实现示例
2020/09/23 Python
html5本地存储 localStorage操作使用详解
2016/09/20 HTML / CSS
法国二手MacBook销售网站:Okamac
2019/03/18 全球购物
临床医师专业个人自我评价范文
2013/11/07 职场文书
开朗女孩的自我评价
2014/02/10 职场文书
《日月潭》教学反思
2014/02/28 职场文书
航海技术专业毕业生求职信
2014/04/06 职场文书
2014组织生活会方案
2014/05/19 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
大学生党课感想
2015/08/11 职场文书
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技