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 相关文章推荐
JsRender for object语法简介
Oct 31 Javascript
JS实现控制表格行文本对齐的方法
Mar 30 Javascript
JS实现可调整倒计时间代码分享
Aug 18 Javascript
纯js代码实现简单计算器
Dec 02 Javascript
js实现C#的StringBuilder效果完整实例
Dec 22 Javascript
基于JavaScript如何制作遮罩层对话框
Jan 26 Javascript
JavaScript String 对象常用方法总结
Apr 28 Javascript
JS简单实现数组去重的方法示例
Mar 27 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
Sep 30 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
Jan 25 Javascript
vue+element项目中过滤输入框特殊字符小结
Aug 07 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
Mar 16 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
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
session 加入redis的实现代码
2016/07/15 PHP
laravel多条件查询方法(and,or嵌套查询)
2019/10/09 PHP
解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
2019/10/16 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
JavaScript判断一个URL链接是否有效的实现方法
2011/10/08 Javascript
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
js返回前一页刷新本页重载页面
2014/07/29 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
详解前端路由实现与react-router使用姿势
2017/08/07 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
AngularJS修改model值时,显示内容不变的实例
2018/09/13 Javascript
使用Python实现文字转语音并生成wav文件的例子
2019/08/08 Python
Python简易版停车管理系统
2019/08/12 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
HTML5 script元素async、defer异步加载使用介绍
2013/08/23 HTML / CSS
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
信息管理专业学生自荐信格式
2013/09/22 职场文书
十八大闭幕感言
2014/01/22 职场文书
人事文员岗位职责
2014/02/16 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
校园文化标语
2014/06/18 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
小学优秀教师材料
2014/12/15 职场文书
2014年教研员工作总结
2014/12/23 职场文书
工作表扬信范文
2015/01/17 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
《所见》教学反思
2016/02/23 职场文书
2016年校园社会综合治理宣传月活动总结
2016/03/16 职场文书
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js
instantclient客户端 连接oracle数据库
2022/04/26 Oracle