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
相关产品推荐
相关产品推荐

