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+ACTIVEX实现网页选择本地目录路径对话框
Mar 18 Javascript
js实现的切换面板实例代码
Jun 17 Javascript
js转化毫秒为时间格式代码
Apr 10 Javascript
javascipt:filter过滤介绍及使用
Sep 10 Javascript
Winform客户端向web地址传参接收参数的方法
May 17 Javascript
JavaScript判断微信浏览器实例代码
Jun 13 Javascript
jQuery动态生成表格及右键菜单功能示例
Jan 13 Javascript
bootstrap Table服务端处理分页(后台是.net)
Oct 19 Javascript
简单介绍react redux的中间件的使用
Apr 06 Javascript
JS 封装父页面子页面交互接口的实例代码
Jun 25 Javascript
ElementUI实现el-form表单重置功能按钮
Jul 21 Javascript
JavaScript选择器函数querySelector和querySelectorAll
Nov 27 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
使用NetBeans + Xdebug调试PHP程序的方法
2011/04/12 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
php时间戳格式化显示友好的时间函数分享
2014/10/21 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
PHP rsa加密解密使用方法
2015/04/27 PHP
php实现短信发送代码
2015/07/05 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
js继承的实现代码
2010/08/05 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
jQuery+HTML5美女瀑布流布局实现方法
2015/09/21 Javascript
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
js模糊查询实例分享
2016/12/26 Javascript
jQuery实现动态添加tr到table的方法
2016/12/26 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
jQuery简单实现对数组去重及排序操作实例
2017/10/31 jQuery
vue项目中api接口管理总结
2018/04/20 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Tensorflow分类器项目自定义数据读入的实现
2019/02/05 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
家长对孩子评语
2014/01/30 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
学校献爱心活动总结
2014/07/08 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
师德承诺书
2015/01/20 职场文书
八年级数学教学反思
2016/02/17 职场文书
JavaScript实现简单计时器
2021/06/22 Javascript
Python开发五子棋小游戏
2022/04/28 Python