从Content-Disposition获取文件名

8

我正在使用JSP将HTML表单中的Blob文件上传到数据库。我需要将文件名插入到DB中。我知道文件名存储在Content-Disposition header中,那么我该如何获取它呢?

1个回答

23

如果您使用JavaEE 6中的HttpServletRequest.getPart上传文件:

Part part = request.getPart("xxx"); // input type=file name=xxx
String disposition = part.getHeader("Content-Disposition");
String fileName = disposition.replaceFirst("(?i)^.*filename=\"?([^\"]+)\"?.*$", "$1");

请参阅Part


正如@Marc所提到的,我没有处理URL编码。(他还将文件名周围的引号设为可选项。)

fileName = URLDecoder.decode(fileName, StandardCharsets.ISO_8859_1);

没有进行检查,但是HTTP头部的编码应该使用默认的ISO-8859-1。


谢谢!以防其他人也尝试这个:我使用Apache CXF rest控制器并从MultipartBody对象中获取“part”作为附件,它对我有效。 - matthieusb
正则表达式非常危险。我想获取name条目的部分,所以用name替换了你的filename。但仍然得到了filename参数,因为你的正则表达式接受在name=之前的任何内容。我认为唯一解析它的方法是逐个字符地迭代,理解你是否在字符串内(文件名可能包含filename=子字符串并误导你)。 - SomethingSomething
这对我有用,而且我认为更安全:1. String regex = "(?i)^.*; " + paramName + "=\"?([^\"]+)\"?.*$";paramName 应该是 filenamename 或者你想要获取的任何东西)。然后 2. return headerLine.replaceFirst(regex, "$1"); - SomethingSomething
唯一的更改是我在你的 (?i)^.* 后面添加了 ; - SomethingSomething
此外,我会将 [^\"]+ 更改为 [^\"]*,因为当前正则表达式不支持空值。 - SomethingSomething
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接