Vue实现附件上传功能


Posted in Javascript onMay 28, 2020

本文实例为大家分享了Vue实现附件上传的具体代码,供大家参考,具体内容如下

前言

前端 UI 是用的是 element-ui 的上传功能

本文主要记录下代码,方便下次复制粘贴

前端部分

HTML

  • limit: 限制文件个数 1 个
  • on-remove: 移除附件时的钩子函数,主要就 console 输出下
  • on-error: 用于处理上传异常后的处理,本人这主要用来关闭弹窗和全屏等待
  • file-list: 绑定附件
  • auto-upload: 禁止自动上传,true 的话选了文件就自动上传
  • http-request: 自定义上传文件请求方法,默认方法会与 mock 产生 XmlRequest 重新生成导致找不到文件问题,我注释了 mock 还是那样,没具体研究
  • action: 原上传文件的路径,由于使用了自定义上传文件请求,即 http-request,因此这个字段随便写就好,不写不行好像
<el-upload
 ref="upload"
 :limit="1"
 :on-remove="handleRemove"
 :on-error="onError"
 :file-list="fileList"
 :auto-upload="false"
 :http-request="uploadFile"
 action="https://jsonplaceholder.typicode.com/posts/"
 class="upload-demo">
 <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
 <!-- <el-button style="margin-left: 10px;" size="small" type="success" @click="submitUpload">上传到服务器</el-button> -->
 <div slot="tip" class="el-upload__tip">支持上传 {{ strRebuild(fileType) }} 格式,且不超过 {{ fileSize }}M</div>
</el-upload>

JS

import { strRebuild, lastSubstring } from '@/utils/strUtil'
import { message } from '@/utils/message'

export default {
 data() {
 return {
 // 附件列表
 fileList: [],
 // 允许的文件类型
 fileType: ['xls', 'xlsx', 'pdf', 'doc', 'docx', 'txt', 'jpg', 'png', 'jpeg'],
 // 运行上传文件大小,单位 M
 fileSize: 10,
 }
 },
 methods: {
 // 清空表单
 clear() {
 // 清空附件
 this.$refs.upload.clearFiles()
 },
 
 // 附件检查
 // 检查附件是否属于可上传类型
 // 检查附件是否超过限制大小
 checkFile() {
 var flag = true
 var tip = ''
 var files = this.$refs.upload.uploadFiles
 files.forEach(item => {
 // 文件过大
 if (item.size > this.fileSize * 1024 * 1024) {
 flag = false
 tip = ' 文件超过' + this.fileSize + 'M'
 }
 // 文件类型不属于可上传的类型
 if (!this.fileType.includes(lastSubstring(item.name, '.'))) {
 flag = false
 tip = ' 文件类型不可上传'
 }
 })
 if (!flag) {
 message('error', tip)
 }
 return flag
 },
 
 // 提交附件
 submitUpload() {
 if (this.checkFile()) {
 console.log('上传附件...')
 this.$refs.upload.submit()
 } else {
 console.log('取消上传')
 }
 },

 // 自定义文件上传方法
 uploadFile(file) {
 // 把文件放入 FormData 进行提交
 const param = new FormData()
 param.append('files', file.file)
 uploadFile(param).then(response => {
 // TODO 一些关闭弹框,上传成功提示等
 })
 },

 // 移除附件
 handleRemove(file, fileList) {
 console.log('移除附件...')
 },

 // 附件上传失败,打印下失败原因
 onError(err) {
 message('error', '附件上传失败')
 console.log(err)
 },

 // 字符串重组
 strRebuild(str) {
 return strRebuild(str)
 }
 }
}

工具类 JS

strUtil.js

// 字符串相关工具类
// 数组根据分隔符重组为字符串
export function strRebuild(arr, split) {
 if (arr === undefined || arr === null || !(arr instanceof Array) || arr.length === 0) {
 return ''
 }
 if (split === undefined || split === null) {
 split = ','
 }
 var str = ''
 arr.forEach((v, i) => {
 if (i === arr.length - 1) {
 str = str + v
 } else {
 str = str + v + split
 }
 })
 return str
}

// 截取最后一个特定字符后面的字符串
export function lastSubstring(str, split) {
 if (str === undefined || str === null || split === undefined || split === null) {
 return ''
 }
 return str.substring(str.lastIndexOf(split) + 1)
}

message.js

import { Message } from 'element-ui'

// 提示封装 type 提示类型, msg 提示信息,duration 持续时间
export function message(type, msg, duration) {
 Message({
 message: msg || 'success',
 type: type || 'success',
 duration: duration || 5 * 1000
 })
}

// 带删除键提示,duration 为 0 时,不会自动消失
// 提示封装 type 提示类型, msg 提示信息,duration 持续时间
export function messageShowClose(type, msg, duration) {
 Message({
 message: msg || 'success',
 type: type || 'success',
 duration: duration || 0,
 showClose: true
 })
}

API

// 附件上传
export function uploadFile(file) {
 return request({
 url: '/uploadFile',
 method: 'post',
 headers: {
 'Content-Type': 'multipart/form-data; charset=utf-8'
 },
 data: file
 })
}

后端接口

/**
 * 单文件上传
 * @param files 接收文件要以数组接收
 * @return
 */
@PostMapping(value="/uploadFile")
public void uploadFile(@RequestBody MultipartFile[] files) {
 // TODO
}

更多文章可以点击《Vue.js前端组件学习教程》学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

更多vue学习教程请阅读专题《vue实战教程》

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

Javascript 相关文章推荐
js的2种继承方式详解
Mar 04 Javascript
JavaScript学习笔记之定时器
Jan 22 Javascript
使用AngularJS创建单页应用的编程指引
Jun 19 Javascript
javascript中arguments,callee,caller详解
Mar 16 Javascript
基于WebUploader的文件上传js插件
Aug 19 Javascript
简单谈谈CommonsChunkPlugin抽取公共模块
Dec 31 Javascript
JS实现的合并多个数组去重算法示例
Apr 11 Javascript
vue.js学习笔记之v-bind和v-on解析
May 03 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
May 31 Javascript
Vue代码整洁之去重方法整理
Aug 06 Javascript
Vue实现base64编码图片间的切换功能
Dec 04 Javascript
js实现秒表计时器
Dec 16 Javascript
如何使用Javascript中的this关键字
May 28 #Javascript
简单了解JavaScript arguement原理及作用
May 28 #Javascript
如何使用JavaScript检测空闲的浏览器选项卡
May 28 #Javascript
js实现轮播图特效
May 28 #Javascript
JS写滑稽笑脸运动效果
May 28 #Javascript
Python版实现微信公众号扫码登陆
May 28 #Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
May 28 #Javascript
You might like
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
PHP ajax 分页类代码
2008/11/13 PHP
PHP会员找回密码功能的简单实现
2016/09/05 PHP
php微信开发之图片回复功能
2018/06/14 PHP
XAMPP升级PHP版本实现步骤解析
2020/09/04 PHP
JavaScript去掉空格的方法集合
2010/12/28 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
2015/03/31 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
node安装--linux下的快速安装教程
2017/03/21 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
VUE实现可随意拖动的弹窗组件
2018/09/25 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
Python封装shell命令实例分析
2015/05/05 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
pytorch中index_select()的用法详解
2021/01/06 Python
草莓网美国官网:Strawberrynet USA
2016/12/11 全球购物
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
莫斯科购买书籍网站:Book24
2020/01/12 全球购物
俄罗斯GamePark游戏商店网站:购买游戏、游戏机和配件
2020/03/13 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
文职个人求职信范文
2013/09/23 职场文书
创业计划书怎样才能打动风投
2014/01/01 职场文书
优秀毕业生求职信范文
2014/01/02 职场文书
矿泉水广告词
2014/03/20 职场文书
小学运动会口号
2014/06/07 职场文书
2014年精神文明工作总结
2014/12/23 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
班主任自我评价范文
2015/03/11 职场文书
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
2021/11/11 Python