Servlet getSubmittedFileName从路径中删除斜杠

时间:2018-04-24 10:36:35

标签: servlets httprequest content-disposition

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

如果文件是在Internet Explorer上传的,则该路径包含在文件名中。

获取文件名如下:

Collection<Part> parts = request.getParts();
for (Part part: parts) {
  if (part.getName().equals(inputName)) {
    System.out.println(part.getSubmittedFileName());
  }
}

导致文件的文件名(在这种情况下为完整路径,因为它是通过ie上传的)显示时没有斜线(例如:如果路径为c://directory/file_name则打印为c:directoryfile_name)< / p>

如果我自己使用part.getHeader("Content-Disposition")得到标题,那么我会看到斜杠存在。

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

由于

3 个答案:

答案 0 :(得分:0)

这似乎是Internet Explorer的错误:

此外,Internet Explorer的本地(Intranet)站点的默认设置会发送整个路径,而Internet站点的默认行为则不会显示整个路径。因此,这只是本地(内联网)使用的问题,对我来说这是无关紧要的。

答案 1 :(得分:0)

在theuy的self-answer上进行了扩展,当(试图)符合{{3]时,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("Content-Disposition")。首先,从该标头中提取filename字段,例如:

  • filename = header.replaceFirst("(?i)^.*filename=\"?([^\"]+)[\";]?.*$", "$1"));

然后,您需要将其修剪为文件名,并删除其他路径元素。这里有很多选择:

  • 再次使用正则表达式:filename = filename.replaceFirst("^.+\\\\([^\\\\]+)$", "$1");
  • 使用引用的RFC 6266FileUploadBase.getFileName(...)
  • 使用Apache Commons FileuploadFilenameUtils.getName(...)

答案 2 :(得分:0)

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

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