element-upload 限制文件尺寸、格式、大小以及隐藏上传框

本文介绍如何在VUE项目中使用element的upload组件限制图片上传的格式、大小、尺寸及数量,实现良好的用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在VUE项目中使用了element的upload上传图片组件
要求

  1. 只能上传jpg / png格式
  2. 图片大小不能超过2M
  3. 图片像素要大于600*400
  4. 图片数量达到上限的时候隐藏上传的框框

模板html

<template>
<div>
<el-upload 
  action = "#"                               //上传的地址,必填
  list-type = "picture-card"                 //文件列表类型,text/picture/picture-card
  :class = "{disabled:isMax}"                //动态绑定class,(此处是隐藏上传框的关键)
  :limit = 3                                 //限制上传图片的数量
  :on-success = "success"                    //文件上传成功的钩子
  :on-error = "error"                        //文件上传失败的钩子
  :on-change = "change"                      //文件状态改变的钩子
  :on-progress = "progress"                  //文件上传时候的钩子 
  :on-remove = "remove"                      //文件移除的钩子
  :before-upload = "beforeAvatarUpload">     //文件上传前的钩子
  <i class="el-icon-upload"></i>           
  <div class="el-upload__text">封面</div>
</el-upload>
</div>
</template>

一、限制图片尺寸、格式、大小

:before-upload的钩子里限制

beforeAvatarUpload:function(file){
      const isJPG = file.type === 'image/jpeg';
      const isPNG = file.type === 'image/png';
      const isPG = (isJPG || isPNG)                                       //限制图片格式为jpg / png
      const isLt2M = file.size / 1024 / 1024 < 2;                         //限制图片大小
      const isSize = new Promise(function(resolve,reject) {
          let width = 600
          let height = 400
          let _URL = window.URL || window.webkitURL
          let img = new Image()
          img.onload = function() {
              let valid = img.width >= width && img.height >= height
              valid ? resolve() : reject();
          }
          img.src = _URL.createObjectURL(file)
      }).then(() => {
          return file;
      },()=>{
          this.$message.error('上传图片像素要大于600*400!');
          return promise.reject();
      })
      if (!isPG) {
          this.$message.error('上传头像图片只能是 JPG 或 PNG 格式!');
      }
      if (!isLt2M) {
          this.$message.error('上传头像图片大小不能超过 2MB!');
      }
        return isPG && isLt2M && isSize
    }
  }

1). window.URL(/window.webkitURL)window对象,将blob或file读取成一个url
格式:

window.URL.createObjectURL(file / blob)
window.webkitURL.createObjectURL(file / blob)

2). image.onload():image对象的onload事件,当图片加载完成后执行的函数

二、限制上传图片数量

upload有一个:limit参数属性以及on-exceed文件超出个数限制的钩子

<el-upload 
  action = "#"
  list-type = "picture-card"
  :limit = 3
  :on-exceed = "exceed">
  <i class="el-icon-upload"></i>
  <div class="el-upload__text">封面</div>
</el-upload>

exceed:function(){
   this.$message.error('最多只能上传3张图片')
},

通过这种方式可以限制用户上传图片的数量但是用户体验不佳,当图片数量达到上限的时候上传图片的框框还在,所以下面就用另外一种方法,当图片数量达到上限之后隐藏上传的框。
在这里插入图片描述

三、隐藏上传框

在这里插入图片描述
先是看到DOM结构可以知道我们要隐藏的是下面的空白上传框
在这里插入图片描述
1.) 动态绑定class:

<el-upload 
    :class = "{disabled:isMax}"
    :on-change = "change"
    :on-remove = "remove"
    :on-error = "error">
</el-upload>

2.) 在data中初始化isMax

data() {
    return {
      isMax : false,
    };
 },
 

3.) 在图片上传(改变) / 删除的时候判断isMax

change:function(file,fileList){
      console.log('change')
      if(fileList.length >= 3){
        this.isMax = true
      }
  },
  remove:function(file,fileList){
      console.log('remove')
      if(fileList.length < 3){
        this.isMax = false
      }
  },
//上传失败的时候会出现Bug,故在上传失败的时候也进行一下判断
error:function(err, file, fileList){
      this.$message.error('上传失败')
      if(fileList.length >= 3){
        this.isMax = true
      }else{
        this.isMax = false
      }
  },
.disabled .el-upload--picture-card{
    display: none
}

当只选择.disabled的时候发现所有都会被隐藏,即disabled是加在整个的div上的,于是加一个.el-upload--picture-card精确到空白上传框上

<think>我们正在解决Element UI的el-upload组件上传附件时不显示文件名的问题。 根据用户提供的引用问题,我们可以总结出以下几点: 1. 用户在使用el-upload组件时,上传附件后文件名不显示。 2. 引用[1][2]中展示了如何修改文件名,但用户的问题是不显示文件名,可能涉及组件的显示问题。 3. 引用[4]提到了文件名过长时的解决方法,通过CSS样式来截断并显示省略号,这可能是文件名不显示的一个原因(因为文件名过长导致显示不全或换行问题)。 4. 另外,不显示文件名也可能是由于组件的默认样式问题或文件列表没有正确渲染。 解决方案可能包括: - 检查文件名是否过长,使用CSS样式进行截断处理(如引用[4]所示)。 - 确保文件列表正确渲染,检查是否有其他错误导致文件名不显示。 步骤: 1. 首先,确保el-upload组件的`file-list`属性绑定了一个数组,并且该数组中的每个文件对象都有`name`属性。 2. 检查是否因为文件名包含特殊字符导致显示问题,可以尝试对文件名进行过滤(如引用[2]所示,但注意用户的问题是不显示,而不是上传报错)。 3. 使用CSS样式控制文件名的显示,防止因过长而隐藏。 具体操作: 1. 在el-upload组件中,通常需要绑定`:file-list="fileList"`,并确保在文件选择后,文件列表被更新。例如: ```html <el-upload :file-list="fileList" ... > </el-upload> ``` 在data中定义fileList数组: ```javascript data() { return { fileList: [] }; } ``` 2. 在`on-change`事件中,更新fileList。注意,`on-change`事件的回调函数会传入三个参数:file, fileList, fileList。我们可以在这里更新fileList。 ```javascript methods: { handleChange(file, fileList) { this.fileList = fileList; } } ``` 3. 如果文件名过长,我们可以使用引用[4]中的CSS样式来添加省略号。在组件的样式部分添加: ```css ::v-deep .el-upload-list__item-name { display: inline-block; width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } ``` 注意:如果使用scoped样式,需要使用`::v-deep`或`/deep/`来穿透作用域。 4. 如果文件名包含特殊字符,虽然可能导致上传问题,但一般不会影响显示。如果怀疑是特殊字符导致,可以尝试在显示前过滤(但注意,这可能会改变用户看到的文件名): ```javascript handleChange(file, fileList) { // 对每个文件名进行过滤 fileList.forEach(item => { // 这里可以过滤特殊字符,但注意:如果只是为了显示,可以在显示时过滤,而不是修改原始文件名 // 如果确实需要修改,可以创建一个新的name属性用于显示,但注意不要影响原始文件对象 // 例如:item.displayName = item.name.replace(Exp, ""); // 然后在模板中使用displayName显示 }); this.fileList = fileList; } ``` 5. 在模板中,我们可以使用作用域插槽来自定义文件列表的显示,这样可以更灵活地控制文件名的显示: ```html <el-upload ...> <!-- 其他内容 --> <template slot-scope="{file}"> <span class="file-name">{{ file.name }}</span> </template> </el-upload> ``` 但是,根据Element UI文档,el-upload组件默认提供了文件列表的显示,通常不需要自定义插槽。如果使用默认列表,确保没有覆盖默认的显示。 6. 另外,检查是否有其他CSS样式覆盖了文件名样式,比如隐藏了文件名(例如:`display: none`或`color: transparent`等)。 7. 如果上述方法都不行,可以尝试更新Element UI本,因为可能是组件的bug。 根据用户的问题,我们重点应该放在文件列表的绑定样式调整上。 因此,我们给出以下解决方案: 步骤一:确保绑定了fileList,并在on-change事件中更新它。 步骤二:添加CSS样式,确保文件名过长时显示省略号。 示例代码: ```vue <template> <div> <el-upload action="https://jsonplaceholder.typicode.com/posts/" :on-change="handleChange" :file-list="fileList" drag > <i class="el-icon-upload"></i> <div class="el-upload__text">将文件拖到此处,或点击<em>上传</em></div> </el-upload> </div> </template> <script> export default { data() { return { fileList: [] }; }, methods: { handleChange(file, fileList) { this.fileList = fileList; } } }; </script> <style scoped> /* 使用深度选择器覆盖element样式 */ ::v-deep .el-upload-list__item-name { display: inline-block; max-width: 200px; /* 设置一个最大宽度 */ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } </style> ``` 注意:上面的CSS中,我们设置了`max-width`,你可以根据实际布局调整。另外,如果文件名仍然不显示,请检查是否因为其他样式覆盖,比如颜色与背景相同等。 如果问题仍未解决,可能需要查看控制台是否有错误信息,或者文件名是否被其他元素遮挡。 相关问题: 1. Element UI的el-upload组件如何自定义文件列表的显示? 2. 如何限制el-upload组件上传文件的类型大小? 3. el-upload组件上传文件时如何显示上传进度? 4. 如何解决el-upload组件上传文件时出现的各种错误?</think>### Element UI el-upload 上传附件不显示文件名解决方法 #### 问题分析 当使用 Element UI 的 `el-upload` 组件时,文件名不显示通常由以下原因导致: 1. **未正确绑定文件列表**:未使用 `file-list` 属性绑定数据源 2. **文件名格式异常**:文件名包含特殊字符或编码问题 3. **样式溢出**:文件名过长导致文本被截断 4. **文件对象未更新**:修改文件名后未正确更新 `file.raw` 对象 --- ### 解决方案 #### 1. 确保绑定文件列表(关键步骤) 在组件中绑定 `:file-list="fileList"` 并初始化数据: ```vue <template> <el-upload :file-list="fileList" <!-- 必须绑定 --> :auto-upload="false" :on-change="handleChange" action="your-upload-url" > <!-- 上传区域 --> </el-upload> </template> <script> export default { data() { return { fileList: [] // 初始化文件列表 }; } }; </script> ``` #### 2. 正确处理文件名(解决特殊字符问题) 在 `on-change` 事件中过滤非法字符并更新文件名: ```javascript methods: { handleChange(file) { // 过滤特殊字符(正则表达式) const cleanName = file.name.replace(/[^\w\u4e00-\u9fa5.-]/g, ''); // 创建新文件对象(保留原始UID) const newFile = new File([file.raw], cleanName, { type: file.raw.type }); newFile.uid = file.uid; // 必须保留UID // 更新文件列表 this.fileList = [{ ...file, name: cleanName, raw: newFile // 关键:更新原始文件对象 }]; } } ``` #### 3. 添加CSS样式(解决长文件名截断) 在全局或组件样式中添加: ```css ::v-deep .el-upload-list__item-name { display: inline-block; max-width: 300px; /* 根据布局调整 */ overflow: hidden; text-overflow: ellipsis; /* 超出部分显示省略号 */ white-space: nowrap; /* 禁止换行 */ } ``` #### 4. 服务器端解码(解决乱码问题) 如果文件名包含中文,需在服务器端解码: ```javascript // Node.js 示例(接收端) app.post('/upload', (req, res) => { const fileName = Buffer.from(req.file.originalname, 'latin1').toString('utf8'); // 处理文件... }); ``` --- ### 完整示例代码 ```vue <template> <el-upload :file-list="fileList" :auto-upload="false" :on-change="handleChange" action="your-upload-url" drag > <i class="el-icon-upload"></i> <div class="el-upload__text">拖拽文件到此处或点击<em>上传</em></div> </el-upload> </template> <script> export default { data() { return { fileList: [] }; }, methods: { handleChange(file) { // 1. 清洗文件名 const cleanName = file.name .replace(/[^\w\u4e00-\u9fa5.-]/g, '') .slice(0, 100); // 限制长度 // 2. 创建新文件对象 const newFile = new File([file.raw], cleanName, { type: file.raw.type }); newFile.uid = file.uid; // 3. 更新文件列表 this.fileList = [{ name: cleanName, status: 'ready', size: file.size, raw: newFile }]; } } }; </script> <style scoped> ::v-deep .el-upload-list__item-name { max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } </style> ``` --- ### 注意事项 1. **UID 必须保留**:Element UI 依赖 `uid` 跟踪文件,修改文件时需手动复制 2. **响应式更新**:修改 `fileList` 时必须创建新数组(`this.fileList = [...]`) 3. **编码一致性**:前端上传文件名建议使用 `encodeURIComponent()`,后端对应解码 4. **文件大小限制**:可添加 `:before-upload` 钩子验证文件有效性 > 通过上述步骤,文件名应正常显示。若问题仍存在,请检查浏览器控制台是否有组件报错,并确认 Element UI 本兼容性[^1][^2][^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值