【问题标题】:Servlet getSubmittedFileName removes slashes from pathServlet getSubmittedFileName 从路径中删除斜杠
【发布时间】:2018-04-24 10:36:35
【问题描述】:

我使用 file 类型的 input 元素通过 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

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

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

谢谢

【问题讨论】:

    标签: servlets httprequest content-disposition


    【解决方案1】:

    扩展theuy 的self-answer,当它(试图)符合@ 中的RFC 6266 987654325@。下面是 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");
    • 使用引用的Apache Commons FileuploadFileUploadBase.getFileName(...)
    • 使用Apache Commons IOFilenameUtils.getName(...)

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-23
          • 2014-08-22
          • 2018-08-15
          • 1970-01-01
          • 1970-01-01
          • 2019-08-06
          • 2015-10-16
          • 2011-06-06
          相关资源
          最近更新 更多