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进阶教程(第四课第一部分)
Apr 05 Javascript
原生javaScript实现图片延时加载的方法
Dec 22 Javascript
jquery对象和DOM对象的任意相互转换
Feb 21 Javascript
js实现统计字符串中特定字符出现个数的方法
Aug 02 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
Nov 04 Javascript
微信小程序 天气预报开发实例代码源码
Jan 20 Javascript
详解Angular 开发环境搭建
Jun 22 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
Sep 04 Javascript
JS实现基于拖拽改变物体大小的方法
Jan 23 Javascript
vue-cli脚手架引入图片的几种方法总结
Mar 13 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
Sep 02 Javascript
微信小程序中的列表切换功能实例代码详解
Jun 09 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
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
PHP中soap的用法实例
2014/10/24 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
PHP通过GD库实现验证码功能示例
2019/02/23 PHP
基于jQuery实现下拉框
2014/11/24 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
Bootstrap table表格初始化表格数据的方法
2018/07/25 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
JavaScript Html实现移动端红包雨功能页面
2021/01/10 Javascript
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
python 连接sqlite及简单操作
2017/06/30 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
执行Django数据迁移时报 1091错误及解决方法
2019/10/14 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
jupyter 实现notebook中显示完整的行和列
2020/04/09 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
如何写好优秀的创业计划书
2014/01/30 职场文书
物业保安员岗位职责
2014/03/14 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
教师节主题班会教案
2015/08/17 职场文书
关于践行三严三实的心得体会
2016/01/05 职场文书
快速学习Oracle触发器和游标
2021/06/30 Oracle