我正在使用JSP将HTML表单中的Blob文件上传到数据库。我需要将文件名插入到DB中。我知道文件名存储在Content-Disposition header中,那么我该如何获取它呢?
如果您使用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。
name
条目的部分,所以用name
替换了你的filename
。但仍然得到了filename
参数,因为你的正则表达式接受在name=
之前的任何内容。我认为唯一解析它的方法是逐个字符地迭代,理解你是否在字符串内(文件名可能包含filename=
子字符串并误导你)。 - SomethingSomethingString regex = "(?i)^.*; " + paramName + "=\"?([^\"]+)\"?.*$";
(paramName
应该是filename
的name
或者你想要获取的任何东西)。然后 2.return headerLine.replaceFirst(regex, "$1")
; - SomethingSomething(?i)^.*
后面添加了;
。 - SomethingSomething[^\"]+
更改为[^\"]*
,因为当前正则表达式不支持空值。 - SomethingSomething