【问题标题】:Get filename from Content-Disposition [closed]从 Content-Disposition 获取文件名 [关闭]
【发布时间】:2014-12-01 10:23:55
【问题描述】:

我正在使用 JSP 将 Blob 文件从 HTML 表单上传到数据库。我需要将文件名插入数据库。我知道文件名存储在Content-Disposition header中,我怎么能得到呢?

【问题讨论】:

    标签: java http jsp content-disposition


    【解决方案1】:

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

    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 休息控制器并从 MultipartBody 对象中获取“部分”作为附件。
    • 您还需要解码文件名,因为它是(URL?)编码的。
    • @Marc 谢谢,没有在野外测试,但我同意。我把责任推给了你。
    • 正则表达式非常危险。我想获得 name 的部分条目,因此将您的 filename 替换为 name。仍然得到filename 参数,因为您的正则表达式接受name= 之前的任何内容。我认为解析它的唯一方法是逐个字符地逐个迭代它,了解您是否在字符串中(文件名可能包含filename= 子字符串并误导您)
    • 这对我有用,我认为更安全: 1. String regex = "(?i)^.*; " + paramName + "=\"?([^\"]+)\"?.*$";paramName 应该是 namefilename 或任何你想得到的)。然后 2.return headerLine.replaceFirst(regex, "$1");
    猜你喜欢
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多