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 动态文字滚动的例子
Jan 17 Javascript
js获取select标签选中值的两种方式
Jan 09 Javascript
JS 获取浏览器和屏幕宽高等信息代码
Mar 31 Javascript
JS 对象属性相关(检查属性、枚举属性等)
Apr 05 Javascript
6种javascript显示当前系统时间代码
Dec 01 Javascript
Jqgrid之强大的表格插件应用
Dec 02 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
Aug 04 Javascript
微信小程序实现图片放大预览功能
Oct 22 Javascript
微信小程序使用swiper组件实现类3D轮播图
Aug 29 Javascript
微信小程序图片左右摆动效果详解
Jul 13 Javascript
javascript实现评分功能
Jun 24 Javascript
vue element table中自定义一些input的验证操作
Jul 18 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
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
BOOM vs RR BO3 第二场2.13
2021/03/10 DOTA
jQuery 页面 Mask实现代码
2010/01/09 Javascript
javascript dom 基本操作小结
2010/04/11 Javascript
3Z版基于jquery的图片复选框(asp.net+jquery)
2010/04/12 Javascript
JQuery写动态树示例代码
2013/07/31 Javascript
多选列表框动态添加,移动,删除,全选等操作的简单实例
2014/01/13 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
深入理解vue路由的使用
2017/03/24 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
python逐行读取文件内容的三种方法
2014/01/20 Python
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
python简单读取大文件的方法
2016/07/01 Python
Python字符串处理实现单词反转
2017/06/14 Python
python中使用%与.format格式化文本方法解析
2017/12/27 Python
Python中修改字符串的四种方法
2018/11/02 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
PIP和conda 更换国内安装源的方法步骤
2020/09/21 Python
纯CSS3代码实现文字描边
2016/04/25 HTML / CSS
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
欢送退休感言
2014/02/08 职场文书
《梅兰芳学艺》教学反思
2014/02/24 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
网络技术专业求职信
2014/07/13 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
护士求职简历自我评价
2015/03/10 职场文书
幸福终点站观后感
2015/06/04 职场文书