我使用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()
?
由于
答案 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");
FileUploadBase.getFileName(...)
FilenameUtils.getName(...)
答案 2 :(得分:0)
默认情况下,Internet Explorer在上传文件时发送完整路径。您可以禁用完整路径设置:
Internet选项>安全性> Internet /本地Intranet>自定义级别>查找“将文件上传到服务器时包含本地目录路径”,并将其设置为“禁用”。