You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IE上传文件时Servlet的getSubmittedFileName去除路径斜杠问题咨询

IE上传文件时文件名路径斜杠丢失的问题分析与修复

为啥会出现这个问题?

老版本IE(比如IE9及以前)上传文件时,和其他浏览器的行为不一样——它会把本地文件的完整绝对路径(比如C:\Users\foo\bar.txt)直接当作文件名提交给服务器。但Servlet API里的Part.getSubmittedFileName()方法,设计目的是获取文件名而非完整路径,所以内部会自动清理路径分隔符(包括Windows的反斜杠\),甚至有些Servlet容器会直接截断路径部分,结果就导致你看到的斜杠消失,路径变成一串连在一起的字符。

另外还有个可能:IE提交的请求里,文件名中的反斜杠被HTTP协议当作转义字符处理了,解析的时候直接被吃掉,最终拿到的字符串就没了斜杠。

怎么解决?

别依赖getSubmittedFileName()了,直接从请求的Content-Disposition头里提取原始的文件名——这个头里保存的是IE提交的原始内容,不会被自动处理,能完整保留带路径的文件名和斜杠。

给你写个可用的代码示例:

Collection<Part> parts = request.getParts();
for (Part part : parts) {
    if (part.getName().equals(inputName)) {
        // 获取Content-Disposition头信息
        String contentDisposition = part.getHeader("Content-Disposition");
        String originalFileName = null;
        
        if (contentDisposition != null) {
            // 分割头信息片段,定位到filename部分
            String[] segments = contentDisposition.split(";");
            for (String seg : segments) {
                seg = seg.trim();
                if (seg.startsWith("filename=")) {
                    // 去掉"filename="前缀,处理可能的引号包裹情况
                    originalFileName = seg.substring(9).trim();
                    if (originalFileName.startsWith("\"") && originalFileName.endsWith("\"")) {
                        originalFileName = originalFileName.substring(1, originalFileName.length() - 1);
                    }
                    break;
                }
            }
        }
        
        // 此时originalFileName就是IE提交的完整带路径的文件名,斜杠全部保留
        System.out.println("原始文件名(含路径):" + originalFileName);
    }
}

额外小技巧

如果其实你只需要纯文件名(不需要路径),拿到原始路径后可以用Java的File类快速提取:

if (originalFileName != null) {
    String justFileName = new File(originalFileName).getName();
    System.out.println("仅文件名:" + justFileName);
}

内容的提问来源于stack exchange,提问作者theyuv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:23:52