Servlets Servlet getSubmittedFileName从路径中删除斜杠

Servlets Servlet getSubmittedFileName从路径中删除斜杠,servlets,httprequest,content-disposition,Servlets,Httprequest,Content Disposition,我使用file类型的input元素通过html表单上传文件 如果文件上载到Internet Explorer,则文件名中将包含路径 按如下方式获取文件名: Collection<Part> parts = request.getParts(); for (Part part: parts) { if (part.getName().equals(inputName)) { System.out.println(part.getSubmittedFileName());

我使用
file
类型的
input
元素通过html表单上传文件

如果文件上载到Internet Explorer,则文件名中将包含路径

按如下方式获取文件名:

Collection<Part> parts = request.getParts();
for (Part part: parts) {
  if (part.getName().equals(inputName)) {
    System.out.println(part.getSubmittedFileName());
  }
}
Collection parts=request.getParts();
用于(零件:零件){
if(part.getName().equals(inputName)){
System.out.println(part.getSubmittedFileName());
}
}
导致文件的文件名(在本例中是完整路径,因为它是通过ie上传的)显示为无斜杠(例如:如果路径是
c://directory/file\u name
,则打印为
c:directoryfile\u name

如果我自己用
part.getHeader(“Content Disposition”)
获取标题,那么我会看到斜杠存在

发生了什么事?如何修复它,使斜杠位于
getSubmittedFileName()


谢谢

这似乎是Internet Explorer的一个错误:

/*
 * Adapted from FileUploadBase.getFileName()
 */
@Override
public String getSubmittedFileName() {
    (...)
                    // RFC 6266. This is either a token or a quoted-string
                    if (fileName.indexOf('\\') > -1) {
                        // This is a quoted-string
                        fileName = HttpParser.unquote(fileName.trim());
                    } else {
                        // This is a token
                        fileName = fileName.trim();
                    }
    (...)
    return fileName;
}
此外,internet explorer对本地(intranet)站点的默认设置发送整个路径,而internet站点的默认行为是不显示整个路径。因此,这只是本地(intranet)使用的问题,对我来说是无关紧要的。

扩展到UY,Internet Explorer部分的这种错误行为在更新于8.0.33的Tomcat版本(试图)符合org.apache.catalina.core.ApplicationPart时变得更加严重。下面是Tomcat代码的相关部分,该代码删除了Internet Explorer提交的文件名中的反斜杠:

/*
 * Adapted from FileUploadBase.getFileName()
 */
@Override
public String getSubmittedFileName() {
    (...)
                    // RFC 6266. This is either a token or a quoted-string
                    if (fileName.indexOf('\\') > -1) {
                        // This is a quoted-string
                        fileName = HttpParser.unquote(fileName.trim());
                    } else {
                        // This is a token
                        fileName = fileName.trim();
                    }
    (...)
    return fileName;
}
所以为了避免这种情况发生,您需要自己评估
part.getHeader(“内容处置”)
。首先,从该标题中提取
filename
字段,例如:

  • filename=header.replaceFirst((?i)^.*filename=\”?([^\“]+)[\”;]?*$”,“$1”);
然后您需要将其修剪为文件名,删除其他路径元素。此处有许多选项:

  • 再次使用正则表达式:
    filename=filename.replaceFirst(“^.+\\\\([^\\\\\]+)$”,“$1”);
  • 使用引用的
    FileUploadBase.getFileName(…)
  • 使用的
    FilenameUtils.getName(…)

默认情况下,Internet Explorer在上载文件时发送完整路径。您可以禁用完整路径设置:

Internet选项>安全>Internet/本地intranet>自定义级别>查找“将文件上载到服务器时包含本地目录路径”,并将其设置为“禁用”