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 相关文章推荐
Add a Formatted Table to a Word Document
Jun 15 Javascript
再谈Jquery Ajax方法传递到action(补充)
May 12 Javascript
集合Bootstrap自定义confirm提示效果
Sep 19 Javascript
帝国cms首页列表页实现点赞功能
Oct 30 Javascript
Vue使用watch监听一个对象中的属性的实现方法
May 10 Javascript
JavaScript生成一个不重复的ID的方法示例
Sep 16 Javascript
关于layui flow loading占位图的实现方法
Sep 21 Javascript
vue实现全匹配搜索列表内容
Sep 26 Javascript
JS实现横向跑马灯效果代码
Apr 20 Javascript
0基础学习前端开发的一些建议
Jul 14 Javascript
jQuery实现带进度条的轮播图
Sep 13 jQuery
JS高级程序设计之class继承重点详解
Jul 07 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
利用PHP创建动态图像
2006/10/09 PHP
php中文字母数字验证码实现代码
2008/04/25 PHP
PHP多例模式介绍
2013/06/24 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
2015/07/01 PHP
php实现的任意进制互转类分享
2015/07/07 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
2017/02/10 PHP
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
Layui组件Table绑定行点击事件和获取行数据的方法
2018/08/19 Javascript
es6数值的扩展方法
2019/03/11 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
Python赋值语句后逗号的作用分析
2015/06/08 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
JavaScript实现一维数组转化为二维数组
2018/04/17 Python
python+influxdb+shell编写区域网络状况表
2018/07/27 Python
python能在浏览器能运行吗
2020/06/17 Python
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
房地产财务部员工岗位职责
2014/03/12 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
动漫设计与制作专业推荐信
2014/07/07 职场文书
“六查”、“三学”、“三干”查摆问题整改措施
2014/09/27 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
国情备忘录观后感
2015/06/04 职场文书
开国大典观后感
2015/06/04 职场文书
初中生物教学随笔
2015/08/15 职场文书
三严三实·严以用权心得体会
2016/01/12 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python