element-ui 文件上传修改文件名的方法示例


Posted in Javascript onNovember 05, 2019

技术背景

Vue + axios + element-ui

问题的产生

一个美好的周五,我正在愉快地打着代码,突然收到一封来自产品的神秘消息,线上活动出 BUG 了!呐尼!怎么可能!一定是你的打开方式不对!打开消息截图,线上的一个聊天室背景突然变成了另一张毫无关联的图(一个大大的太阳),我一看,这不是我刚刚上传的一个图嘛!为什么跑到那里去了!

问题定位

我们所有的静态资源(比如图片)都会上传到一个服务器上,在活动中访问时会统一访问静态资源服务器,而静态资源上传时并没有处理重名问题!!!接口侧仅仅是在前面加了一个4位数的随机数,也就是说,当同名图片超过 10000 张时,百分百会有图片被覆盖!!没错是直接覆盖而不是报错!即使不到10000张,同名数量越多,被覆盖概率也就越高。

开始甩锅

遇到问题不用慌!只要锅甩的好,一切问题都不是问题!我直接找到后台负责人,描述了一下情况,只见他云淡风轻地说了一句:这不是我的 KPI 。???我 ** 你个 xx,男人都是大猪蹄子!靠别人是不行了,只能靠自己,还是自己搞一下吧。

尝试偷懒

element-ui 屹立这么多年,我相信它一定能够完成修改文件名的重任,于是满怀期待地打开官方文档,很好!不支持!现在是周五晚上六点半,很好,注定又不能好好吃饭了!

拦截文件上传

文件对象(file)是不能直接修改文件名的,file.name 是只读属性,如果你强行赋值,会直接报错,所以只能拦截掉 element-ui -> uploader 的默认上传行为,改为自己上传。下面为核心 HTML 代码,主要是利用 before-upload 事件来阻止上传

<el-upload :before-upload="beforeUpload">
  <i class="el-icon-plus" />
</el-upload>

beforeUpload 代码:既然 file.name 是只读属性,那就只能新建一个 file 对象了。你不仁,就不要怪我不义了!新建的文件名为时间戳 + 原文件名。

beforeUpload(file) {
  const timeStamp = new Date() - 0
  const copyFile = new File([file], `${timeStamp}_${file.name}`)
  this.uploadFile(copyFile)
  return false
}

uploadFile 代码:构建一个 FormData 对象,仅此而已!

uploadFile(file) {
  const formdata = new FormData()
  formdata.append('lbf-file-upload', file)
  formdata.append('name', 'lbf-file-upload')
  formdata.append('_csrfToken', this.$ajax.getCsrfToken()._csrfToken)
  this.postForm(formdata)
}

postForm 代码:利用 axios 库上传到服务器。

postForm(formdata) {
  this.$ajax.post('/xxx/ajax/general/file/files', formdata).then(res => {
    if (res.code == null || res.code === 0) {
      // do something
    } else {
      this.$message.error(res.msg || res.message || '文件上传失败')
    }
  }).catch((err) => {
    this.$message.error(err.message || '文件上传失败')
  })
}

就此搞定!以后所有的文件上传都将自动带上时间戳前缀,后台4位随机数机制 + 时间戳 + 文件名,要再想覆盖,简直难如程序员找女朋友!

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

Javascript 相关文章推荐
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
Sep 28 Javascript
js优化针对IE6.0起作用(详细整理)
Dec 25 Javascript
javascript基于HTML5 canvas制作画箭头组件
Jun 25 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
Sep 04 Javascript
基于jQuery实现数字滚动效果
Jan 16 Javascript
React为 Vue 引入容器组件和展示组件的教程详解
May 03 Javascript
Bootstrap-table使用footerFormatter做统计列功能
Sep 07 Javascript
js异步上传多张图片插件的使用方法
Oct 22 Javascript
JavaScript实现新年倒计时效果
Nov 17 Javascript
使用Vue 实现滑动验证码功能
Jun 27 Javascript
vue实现验证用户名是否可用
Jan 20 Vue.js
vue完美实现el-table列宽自适应
May 08 Vue.js
vue keep-alive 动态删除组件缓存的例子
Nov 04 #Javascript
javascript如何实现create方法
Nov 04 #Javascript
关于vue里页面的缓存详解
Nov 04 #Javascript
vue2.0 获取从http接口中获取数据,组件开发,路由配置方式
Nov 04 #Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
Nov 04 #Javascript
vue实现权限控制路由(vue-router 动态添加路由)
Nov 04 #Javascript
Vue路由对象属性 .meta $route.matched详解
Nov 04 #Javascript
You might like
PHP编码转换函数 自动转换字符集支持数组转换
2012/12/16 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
php获取淘宝分类id示例
2014/01/16 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
浅析PHP文件下载原理
2014/12/25 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
javascript mouseover、mouseout停止事件冒泡的解决方案
2009/04/07 Javascript
Lazy Load 延迟加载图片的 jQuery 插件
2010/02/06 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
全面了解JS中的匿名函数
2016/06/29 Javascript
JS使用cookie设置样式的方法
2016/06/30 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
原生js实现下拉选项卡
2019/11/27 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
python读取html中指定元素生成excle文件示例
2014/04/03 Python
Python生成器(Generator)详解
2015/04/13 Python
python 性能提升的几种方法
2016/07/15 Python
Python面向对象进阶学习
2019/05/21 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
pandas分组聚合详解
2020/04/10 Python
python db类用法说明
2020/07/07 Python
Python调用高德API实现批量地址转经纬度并写入表格的功能
2021/01/12 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
Hobbs官方网站:英国奢华女性时尚服装
2020/02/22 全球购物
软件测试企业面试试卷
2016/07/13 面试题
教师实习自我鉴定
2013/12/13 职场文书
学生自我鉴定模板
2013/12/30 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
浅谈Redis存储数据类型及存取值方法
2021/05/08 Redis