vue+elementui中el-upload组件上传文件时,修改文件名,不用FormData

news2025/1/21 0:53:17

前言

今天在开发的时候,后端突然提了一个需求,因为特殊的文件上传不进文件服务器,所以后端问我能不能上传的时候给加个扩展名,本着只要逻辑没问题,都可以通过代码实现的理念,我说:“可以“”,于是乎有了这篇文章。

一、看别人怎么做的

首先是去element官网逛了逛,发现也没有提供修改文件拓展名的方法,所以只能请求度娘了。
百度了一下,发现别人都是使用普通的文件上传方式,代码一大堆,在钩子函数beforeUpload中获取到上传的文件后,修改名字,然后转成FormData后再用axios调接口上传。
然后我就试了,结果没成功,没办法,只能自己动手,从组件底层来找方法了。这一试,就搞了半天,好在最后成功了。

二、自己做

最终代码如下(用element官网的例子改的)

<template>
  <el-upload
    ref='upload'
    drag
    :auto-upload="false"
    action="https://jsonplaceholder.typicode.com/posts/"
    :limit="1"
    :on-change="handleChange">
    <i class="el-icon-upload"></i>
    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  </el-upload>
</template>
<script>
  export default {
    props: {
      //添加文件扩展名
      extendName: {
        type: String,
        default: '.rar'
      }
    },
    data() {
      return {};
    },
    methods: {
      handleChange(file) {
        let fileName = file.name + this.extendName  // 如果可以上传多个文件,这里需要用fileList.forEach()处理
        let f = new File([file.raw],fileName);
        f.uid = file.uid; // new File 没有uid属性,会导致组件底层报错,这里手动加上
        file.raw = f;  // 用f替换file的数据
        console.log(file.raw)
        this.$refs.upload.submit(); // 手动触发上传
      },
    }
  }
</script>

一次上传单个文件的核心代码不多,就几行。如果是上传多个文件就需要用fileList来的处理,这里就不写了

下面讲一下代码

  1. 首先得关闭组件的自动上传
  2. fileName就是我们最终要的文件名,这里的业务需求就是添加一个扩展名
  3. f是使用 new File创建的新的文件对象,在创建文件对象的时候给它新名字fileName(刚开始想的是,直接用file.raw.name = fileName 但是结果报错说name是只读属性,不能修改,所以这里使用new File创建新文件,然后整个替换掉raw)
  4. 这里的f.uid = file.uid是el-upload底层会用uid去匹配fileList数组中的文件,如果没有这个uid最后匹配返回的null会在底层报错。下面是源码位置:node_modules\element-ui\packages\upload\src\index.vue
    // 匹配
    getFile(rawFile) {
     let fileList = this.uploadFiles;
     let target;
     fileList.every(item => {
       target = rawFile.uid === item.uid ? item : null;
       return !target;
     });
     return target;
   },
   handleProgress(ev, rawFile) {
     const file = this.getFile(rawFile);
     this.onProgress(ev, file, this.uploadFiles);
     // 报错点 null没有status属性
     file.status = 'uploading';
     file.percentage = ev.percent || 0;
   },
  1. 更新file.raw为修改文件名后的文件对象
  2. 手动调用submit()上传文件

最终效果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

攻防世界WEB练习区(backup、cookie、disabled_button)

前言 作者简介&#xff1a;不知名白帽&#xff0c;网络安全学习者。 博客主页&#xff1a;https://blog.csdn.net/m0_63127854?typeblog 攻防世界专栏&#xff1a;https://blog.csdn.net/m0_63127854/category_11983747.html 网络安全交流社区&#xff1a;https://bbs.csdn.ne…

uniApp h5项目通过命令行打包,并生成指定路径、文件名称

需求&#xff1a;想要自动化部署uni项目&#xff0c;平常的uni项目是通过可视化构建&#xff0c;导致我们的自动部署成了半自动&#xff0c;非常不爽&#xff0c;于是就找到了下面这种方法 首先&#xff0c;用hb新建一个项目 然后&#xff0c;通过cli新建一个项目 文档 vue c…

禁止 input 自动填充

禁止 input 自动填充 在编写 Form 表单样式的时候&#xff0c;修改自动填充后的 input 样式是很麻烦甚至不可行的&#xff0c;而且还有一些不需要自动填充的场景。 浏览器根据保存数据时表单控件的 type 和 name 去匹配。 常用的就是 type 为 password&#xff0c;name 为 em…

Android 设置Padding和Margin(动态/静态)

一、什么是padding&#xff0c;什么是margin&#xff1f; 在Android界面开发时&#xff0c;为了布局更加合理好看&#xff0c;很多时候会用上Padding和Margin&#xff0c; padding和margin是什么呢&#xff1f;即内边距和外边距&#xff1b; 某个View指定为padding是针对该V…

vue制作一个好看的网页

1.安装并配置node.js (见本人博客-node.js) 2.建好的项目目录如下 build: 用来存放项目构建脚本 config: 存放项目的一些基本配置信息&#xff0c;最常用的就是端口转发 node_modules:这个目录存放项目的所有依赖&#xff0c;由npm install 下载来的文件 src:存放项目的源…

Vue设置浏览器小图标(ICON)

Vue设置浏览器小图标 当我们使用浏览器做开发时&#xff0c;我们能希望浏览器标签页能显示自己的logo小图标&#xff0c;这个是怎样设置的呢&#xff1f; 第一步&#xff1a;准备logo图片信息 找到自己的logo&#xff0c;通过图片在线转换格式&#xff0c;转换成32*32的ico为…

css关于文本溢出

处理思路 1&#xff09;给需要做溢出处理的文本元素设置width或者max-width 2&#xff09;超出部分省略 overflow:hidden 3) 文本溢出处理方式 text-overflow: ellipsis | clip | 自定义字符 如&#xff1a;“_” “.” 4) 设置文本不换行 white-space: nowrap 单行文本溢出 …

Rust开发WebAssembly在Html和Vue中的应用【后篇】

【建议先看】继上一篇【Rust开发WebAssembly在Html和Vue中的应用】遗留下来的问题 Rust开发WebAssembly在Html和Vue中的应用_一码超人的博客-CSDN博客 本文讲述Vue2与H5版uniapp如何引入rust webassembly的应用流程 在上一文中末尾&#xff0c;我说过vue2在引入胶水js后执行…

关于vue2与vue3

Vue组件之间通信方式有哪些 vue是组件化开发框架&#xff0c;所以对于vue应用来说组件间的数据通信非常重要。 1. 组件通信常用方式有以下8种: props $emit/$on $children/$parent $attrs/$listeners ref $root eventbus vuex 注意vue3中废弃的几个API 在vue3中废除$c…

前端实现tab栏切换,这么常见的案例你学会了吗?

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域新星创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

vue2 vue-router 不显示页面问题

目录 菜鸟入门&#xff0c;配置vue-router一直不显示。 排除过的问题点&#xff1a; 项目源码如下&#xff1a; 分析&#xff1a; 解决方案&#xff1a; 可能会遇到错误 这vue-router页面总算出来了&#xff1a; 菜鸟入门&#xff0c;配置vue-router一直不显示。 首先去…

el-cascader数据渲染及回显至页面(以及踩坑历程+解决)

第一次使用el-cascader就把坑踩了个遍&#xff0c;写个记录&#xff0c;也希望能够帮助到同为小猿的你们。 下面是我写的一个还原项目的例子 Bug1 首先是最小子集仍然有children&#xff0c;但是children为空数组&#xff0c;el-cascader渲染时&#xff0c;发现有children所…

【已解决】VUE3+webpack >5报错问题

问题截图&#xff1a; This is no longer the case. Verify if you need this module and configure a polyfill for it.If you want to include a polyfill, you need to:- add a fallback resolve.fallback: { "process": require.resolve("process/browser&q…

微信小程序父子组件之间传值

父子组件之间传值 组件之间传值有两种&#xff0c;一种是父向子传值&#xff0c;另外一种是子向父传值 先说一下大致的区别吧… 区别&#xff1a; 父向子传值使用的是属性绑定&#xff0c;子组件中 的 properties 对象 进行接收父组件传递过来的值子向父传值使用的是自定义…

wangEditor5在vue中的基本使用

目录 一、wangEditor5是什么 二、wangEditor5基本使用 &#xff08;一&#xff09;、安装 &#xff08;二&#xff09;、编译器引入 &#xff08;三&#xff09;、css及变量引入 三、wangEditor5工具栏配置 &#xff08;一&#xff09;、editor.getAllMenuKeys() &…

uniapp自定义tabbar(支持中间凸起,角标,动态隐藏tab,全端适用)

uniapp自定义tabbar&#xff08;支持中间凸起&#xff0c;角标&#xff0c;全端适用&#xff09;背景思路实现尾巴背景 在使用uniapp进行开发时&#xff0c;tabbar是我们使用的很频繁的一个组件&#xff0c;但是在特定的平台会有一些使用上的限制&#xff0c;无法通过一套代码…

box-sizing:border-box的理解和作用

盒子模型 盒子模型是指&#xff1a;外边距&#xff08;margin&#xff09; border&#xff08;边框&#xff09; 内边距&#xff08;padding&#xff09; content&#xff08;内容&#xff09; 可以把每一个容器&#xff0c;比如div&#xff0c;都看做是一个盒子模型 比如你给…

Vue实战【Vue开发中的的前端代码风格规范】

目录&#x1f31f;前言&#x1f31f;命名规范1.1 项目文件命名1.1.1 项目名1.1.2 目录名1.1.3 图像文件名1.1.4 HTML 文件名1.1.5 CSS 文件名1.1.6 JavaScript 文件名1.2 Vue 组件命名1.2.1 单文件组件名1.2.2 单例组件名1.2.3 基础组件名1.2.4 业务组件1.2.5 紧密耦合的组件名…

前端开发中常见的浏览器兼容性问题及解决方案

文章目录前言一、浏览器四大内核二、主流兼容问题&#xff08;一&#xff09;浏览器引擎&#xff08;二&#xff09;兼容问题的原因&#xff08;三&#xff09; 为什么浏览器会存在兼容性问题?&#xff08;四&#xff09;处理兼容问题的思路1. 要不要做&#xff1f;2. 做到什么…

vue3 | HighCharts实战自定义封装之径向条形图

1.前言 目前正在做vue3的数据可视化项目&#xff0c;vue3的组合式api写法十分方便&#xff0c;可以有各种玩法&#xff0c;有兴趣的同学可以看我个人主页的其他文章。难点是在网上找了一圈的有关径向条形图的示例都没有好的解决方案&#xff0c;决心亲自下手&#xff0c;在其中…