如何在 Java 中通过 String.endsWith() 验证用户上传的文件变量是否符合白名单后缀
必须先标准化文件名:提取纯文件名、去除空格、转小写、确保点号存在且非开头,再用白名单集合比对真实后缀,避免大小写、空格、路径干扰及误匹配。该流程通过预处理可有效防止误判,提高文件类型识别可靠性。
必须先标准化文件名再校验后缀——提取纯文件名、去除空格、转小写、确保点号存在且非开头,最后用白名单集合比对真实后缀。

直接用 String.endsWith() 去判断文件后缀是否在白名单里?这事儿,还真不靠谱。它根本搞不定大小写差异、多余空格、路径干扰乃至点号缺失这些问题。要想验证得稳,必须先给文件名做个“大扫除”——标准化,再比对。
提取真实文件名,剥离路径和空格
用户上传过来的文件名,很可能带着一长串路径,比如 "C:\Users\a\photo.JPG",或者前后还藏着空格。直接拿来就用,大概率要翻车。正确的步骤是:先用 FilenameUtils.getName()(Apache Commons IO 里就有)或者 new File(path).getName() 把纯文件名提出来,紧接着调用 trim() 把前后空白字符清干净。千万别偷懒,直接拿原始文件名去调 endsWith()。
统一转为小写,消除大小写敏感问题
endsWith() 默认是区分大小写的,但常见的后缀,像 "JPG"、"jpg"、"Jpg",都应该是合法值。所以,绕开这个坑的办法很简单:把文件名和白名单里的后缀,全部转成小写再做比对。比如,用 fileName.toLowerCase().endsWith(".pdf"),同时白名单也统一存储为小写字符串,像 Set.of(".pdf", ".png", ".jpg") 这样。
检查后缀前必须有英文点号,防止误匹配
这里还有一个很容易忽略的陷阱:"report.pdf".endsWith(".pdf") 当然没问题,但 "my.pdf.backup".endsWith(".pdf") 也会返回 true——这显然不是我们想要的“以 .pdf 结尾”的意思。更稳妥的做法是:先用 String.lastIndexOf('.') > 0 确保点号存在且不在开头,然后再用 String.substring() 把最后一段后缀提取出来,拿到白名单里去查。或者,直接上正则:fileName.toLowerCase().matches(".*\.((pdf|png|jpg|jpeg|txt))$"),一步到位。
推荐做法:用白名单集合 + 标准化后缀提取
把这些要点串起来,一个能打的验证逻辑就出来了:
String cleanName = FilenameUtils.getName(fileName).trim();
int lastDot = cleanName.lastIndexOf('.');
if (lastDot <= 0) return false;
String ext = cleanName.substring(lastDot).toLowerCase(); // 包含点号,如 ".jpg"
Set whitelist = Set.of(".pdf", ".png", ".jpg", ".jpeg", ".txt");
return whitelist.contains(ext);
如果项目里不方便引入 Commons IO,也可以用 cleanName.substring(cleanName.lastIndexOf(File.separatorChar) + 1) 来替代 FilenameUtils.getName(),效果是一样的。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。
Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,













