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 相关文章推荐
JSON 学习之完全手册 图文
May 29 Javascript
一个用js实现控制台控件的代码
Sep 04 Javascript
用dom+xhtml+css制作的一个相册效果代码打包下载
Jan 24 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
Jan 26 Javascript
javascript运行机制之this详细介绍
Feb 07 Javascript
javascript的propertyIsEnumerable()方法使用介绍
Apr 09 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
Mar 02 Javascript
基于javascript实现图片懒加载
Jan 05 Javascript
jQuery实现伪分页的方法分享
Feb 17 Javascript
数组Array的排序sort方法
Feb 17 Javascript
jQuery点击头像上传并预览图片
Feb 23 Javascript
Vue.js数据绑定之data属性
Jul 07 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 HTML代码串 截取实现代码
2009/06/29 PHP
微盾PHP脚本加密专家php解密算法
2020/09/13 PHP
php 模拟post_验证页面的返回状态(实例讲解)
2013/10/28 PHP
php导出生成word的方法
2015/12/25 PHP
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
php注册登录系统简化版
2020/12/28 PHP
js有关元素内容操作小结
2011/12/20 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
js如何判断不同系统的浏览器类型
2013/10/28 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
Javascript中call与apply的学习笔记
2014/09/22 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
Angular中的$watch、$watchGroup、$watchCollection
2017/06/25 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
2019/05/07 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
Python sys.path详细介绍
2013/10/17 Python
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
Python实现SVN的目录周期性备份实例
2015/07/17 Python
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
Python中flatten( )函数及函数用法详解
2018/11/02 Python
python中有函数重载吗
2020/05/28 Python
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
Servlet如何得到客户端机器的信息
2014/10/17 面试题
公司合作协议书范本
2014/04/18 职场文书
护士感人事迹
2014/05/01 职场文书
洗手间标语
2014/06/23 职场文书
护士求职自荐信
2015/03/25 职场文书
工作证明书
2015/06/15 职场文书
校园运动会广播稿
2015/08/19 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle