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 相关文章推荐
js可突破windows弹退效果代码
Aug 09 Javascript
Javascript学习笔记4 Eval函数
Jan 11 Javascript
JQuery给元素添加/删除节点比如select
Apr 02 Javascript
JavaScript实现将xml转换成html table表格的方法
Apr 17 Javascript
javascript实现模拟时钟的方法
May 13 Javascript
Javascript连接Access数据库完整实例
Aug 03 Javascript
基于Javascript实现弹出页面效果
Jan 01 Javascript
聊一聊JavaScript作用域和作用域链
May 03 Javascript
微信小程序下拉菜单效果的实例代码
May 14 Javascript
JavaScript中的惰性载入函数及优势
Feb 18 Javascript
快速了解Vue父子组件传值以及父调子方法、子调父方法
Jul 15 Javascript
Array.filter中如何正确使用Async
Nov 04 Javascript
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使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
2019/10/30 PHP
jquery 上下滚动广告
2009/06/17 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
JS实现5秒钟自动封锁div层的方法
2015/02/20 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
详解javascript中的babel到底是什么
2018/06/21 Javascript
Cookbook组件形式:优化 Vue 组件的运行时性能
2018/11/25 Javascript
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
2018/12/12 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
2019/11/26 Javascript
JavaScript实现网页下拉菜单效果
2020/11/20 Javascript
[01:11:02]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
pycharm 使用心得(三)Hello world!
2014/06/05 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
Python中扩展包的安装方法详解
2017/06/14 Python
python实现键盘控制鼠标移动
2020/11/27 Python
使用python对文件中的单词进行提取的方法示例
2018/12/21 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
python实现猜拳小游戏
2020/04/05 Python
如何使用repr调试python程序
2020/02/28 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
《生命的药方》教学反思
2014/04/08 职场文书
法律专业求职信
2014/05/24 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
处级干部考察材料
2014/12/24 职场文书
Java实现简易的分词器功能
2021/06/15 Java/Android
Vue的过滤器你真了解吗
2022/02/24 Vue.js