elementui el-upload在on-change中校验文件类型错误时隐藏文件列表

该文章介绍了一个Vue.js组件`el-upload`的使用,它限制用户只能上传PDF文件。当文件类型不符时,组件会清除文件列表并显示错误消息。`on-change`、`on-exceed`和`on-success`等事件处理函数被用于控制上传流程。

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

在这里插入图片描述

<el-upload
                        
                        ref="uploadref"
                        :limit="1"
                        :action="url"
                        :on-change="handleChang"
                        :on-exceed="handleExceed"
                        :auto-upload="false"
                        :on-success="ywzgdw_data"
                        >
                        <el-button slot="trigger" size="small" type="danger">上传</el-button>
                      </el-upload>
handleChang(file, fileList, index){
	// 检测文件类型不符合时终止显示文件列表
	if(file.type != 'application/pdf'){
		this.$message.error('只能上传 pdf 文件')
		console.log(this.$refs.uploadref)
		this.$refs.uploadref.uploadFiles=[];
		return false;
	}
	
}

参考:https://blog.youkuaiyun.com/m0_60908822/article/details/122079494

<think>好的,我现在需要帮助用户了解如何使用el-upload组件实现上传校验功能。首先,我应该回忆一下ElementUI的文档以及用户提供的引用内容。用户提到的引用里提到了el-upload的基本用法,包括手动上传和覆盖http-request方法,还有文件列表的处理。这些可能和校验有关。 首先,上传校验通常包括文件类型、大小、数量等的检查。根据引用内容,el-upload有:before-upload这个钩子函数,它可以在上传前执行,返回false或者Promise来阻止上传。这可能是一个关键点。另外,用户可能需要在前端进行即校验,比如选择文件后立即检查,而是等到上传候。这候可能需要用到on-change事件,这个事件在文件选择后触发,可以用来做实校验。 然后,引用中的示例提到了使用auto-upload设置为false来手动处理上传,这可能和校验后手动触发上传有关。比如,用户可能先检查文件是否符合条件,然后决定是否加入上传列表或者提示错误。 接下来,我需要考虑如何具体实现这些校验。比如,文件类型校验可以通过检查文件的type属性或者后缀名;文件大小可以通过size属性,转换成MB或KB来比较;数量限制可以通过file-list的长度来控制。同错误提示需要使用ElementUI的Message组件来显示。 用户可能还需要在提交表单统一处理所有校验,这候可能需要结合表单验证和el-upload的状态。例如,在表单提交前检查文件列表是否为空,或者是否有未通过校验的文件。 此外,引用中提到的http-request覆盖默认上传行为,可能在某些校验场景下需要自定义上传逻辑,比如添加额外的参数或处理多文件上传。 需要注意的是,同的校验场景可能需要同的事件处理。例如,before-upload在自动上传触发,而on-change在每次文件选择触发,无论是否自动上传。因此,如果用户选择手动上传,可能需要在on-change里做校验,或者在提交遍历文件列表进行校验。 最后,应该给出一个完整的示例,展示如何结合这些钩子函数和事件来实现类型的校验,包括前端提示和阻止符合条件的文件上传。同,要提醒用户注意file-list的处理,可能需要手动维护文件列表,特别是在auto-upload为false的情况下。</think>### el-upload 文件上传校验实现方法 #### 一、核心校验场景及实现方式 1. **文件类型校验** 通过`before-upload`钩子拦截非法类型文件: ```html <el-upload :before-upload="checkFileType" action="/api/upload"> </el-upload> ``` ```javascript methods: { checkFileType(file) { const allowedTypes = ['image/jpeg', 'application/pdf']; if (!allowedTypes.includes(file.type)) { this.$message.error('仅支持 JPG/PDF 格式'); return false; // 阻止上传 } return true; } } ``` 2. **文件大小限制** 在`before-upload`中校验文件体积: ```javascript checkFileSize(file) { const maxSize = 5 * 1024 * 1024; // 5MB if (file.size > maxSize) { this.$message.error('文件能超过5MB'); return false; } return true; } ``` 3. **自定义内容校验** 通过`on-change`事件实现实校验(适用于手动上传模式): ```html <el-upload :auto-upload="false" :on-change="handleFileChange"> </el-upload> ``` ```javascript handleFileChange(file, fileList) { if (file.name.length > 50) { this.$message.error('文件得超过50字符'); fileList.pop(); // 移除非法文件 } this.fileList = fileList; } ``` #### 二、复合校验示例 ```html <el-upload action="#" :auto-upload="false" :before-upload="beforeUpload" :on-change="handleChange" :file-list="fileList"> <el-button>选择文件</el-button> </el-upload> <el-button @click="submitUpload">提交</el-button> ``` ```javascript data() { return { fileList: [] } }, methods: { // 预校验 beforeUpload(file) { return new Promise((resolve, reject) => { if (file.type !== 'application/pdf') { this.$message.error('仅支持PDF文件'); reject(); } else if (file.size > 10485760) { this.$message.error('文件超过10MB限制'); reject(); } else { resolve(true); } }); }, // 实校验 handleChange(file, fileList) { const hasDuplicate = fileList.some(f => f.name === file.name); if (hasDuplicate) { this.$message.warning('重复文件已过滤'); this.fileList = fileList.slice(0, -1); return; } this.fileList = fileList; }, // 最终提交校验 submitUpload() { if (this.fileList.length === 0) { this.$message.error('请选择至少一个文件'); return; } // 执行上传操作 } } ``` #### 三、特殊场景处理 1. **多文件数量限制** ```html <el-upload :limit="3" :on-exceed="handleExceed"> </el-upload> ``` ```javascript handleExceed(files, fileList) { this.$message.warning(`最多上传3个文件,已选择${files.length}个`); } ``` 2. **服务端二次校验** 在`on-success`回调中处理服务端返回的错误: ```javascript onSuccess(response, file) { if (response.code !== 200) { this.$message.error(response.msg); this.removeFile(file); // 从列表移除失败文件 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值