rich:fileUpload上传扩展名前含空格的TXT文件失败问题求助
解决RichFaces
<rich:fileUpload>对扩展名含空格文件的类型校验问题 这个问题我之前也碰到过——RichFaces的<rich:fileUpload>组件的前端类型校验逻辑确实会把扩展名前的空格当成扩展名的一部分,导致像filename .txt这种文件被误判为不支持类型。而且这步校验是在调用后端监听器之前触发的,所以根本走不到Java代码层面。下面给你两个层面的解决方案,从前端到后端彻底解决这个问题:
一、前端修改组件的类型校验逻辑(核心解决前端误判)
RichFaces的文件上传组件是通过前端JS做类型校验的,我们可以直接覆盖它的类型检查方法,在校验前先修剪文件名的空格:
// 等待页面加载完成后,覆盖RichFaces的文件类型校验方法 document.addEventListener('DOMContentLoaded', function() { // 替换默认的isValidType方法 if (RichFaces && RichFaces.ui && RichFaces.ui.FileUpload) { RichFaces.ui.FileUpload.prototype.isValidType = function(file) { // 如果没有设置允许的类型,直接返回通过 if (!this.acceptedTypes || this.acceptedTypes.length === 0) { return true; } // 1. 先修剪文件名前后的空格 var trimmedFileName = file.name.trim(); // 2. 找到最后一个点的位置,截取扩展名 var dotIndex = trimmedFileName.lastIndexOf('.'); var fileExt = dotIndex !== -1 ? trimmedFileName.substring(dotIndex + 1).toLowerCase() : ''; // 检查扩展名是否在允许列表中 return this.acceptedTypes.indexOf(fileExt) !== -1; }; } });
把这段脚本放在你的XHTML页面的<h:head>标签里,或者页面底部(确保在RichFaces的核心JS之后加载)。这样修改后,组件会先把文件名的前后空格去掉,再提取扩展名做校验,filename .txt会被识别为txt类型,就能通过前端校验了。
二、后端二次处理文件名(保障数据安全)
前端校验可以被绕过,所以在你的DfeOper017MBean.listener监听器里,一定要对文件名做二次修剪处理,避免后续业务逻辑出错:
public void listener(FileUploadEvent event) throws IOException { UploadedFile uploadedFile = event.getUploadedFile(); String originalFileName = uploadedFile.getName(); // 处理文件名:先修剪前后空格,再替换扩展名前的空格 String processedFileName = originalFileName.trim() // 把"文件名 .txt"改成"文件名.txt" .replaceAll("\\s+\\.", "."); // 后续业务逻辑:比如保存文件、记录文件名等,使用processedFileName // ... }
补充说明
- 为什么前端处理是必须的?因为
<rich:fileUpload>的acceptedTypes校验是前端优先的,只有通过了前端校验,才会触发后端的监听器方法,所以必须先解决前端的误判问题。 - 如果你不想覆盖整个方法,也可以修改
ontyperejected事件,在触发错误提示前手动检查文件名,但这种方式不如覆盖校验方法彻底,容易有遗漏。
内容的提问来源于stack exchange,提问作者valik
相关产品推荐
相关产品推荐

