【问题标题】:URL Encoding Strings that aren't valid URIs不是有效 URI 的 URL 编码字符串
【发布时间】:2013-05-19 14:34:26
【问题描述】:

我不确定我是否完全理解 URI 对象才能正确执行此操作。我希望能够将字符串转换为 url 编码的字符串。例如,我有一个 servlet 作为文件处理程序,我需要在标题中指定文件名 -

response.setHeader("Content-disposition", "attachment;filename=" + new URI(filename).toUrl());

正如预期的那样,我收到了 URISyntaxException,因为我正在编码的字符串不是正确的 URI 格式。

如何编码 字符串 而不是 URL?

我无法使用已弃用的 URLEncoder 获得我想要的结果,因为它将“”替换为“+”而不是“%20”。

提前致谢!

【问题讨论】:

  • 你的文件名是什么样的?
  • 这是它遇到问题的空间。假设我上传了一个名为“hello world.txt”的文件,当我下载回来时,我会得到“hello+world.txt”。在这一点上我很挑剔,但这让我很恼火!

标签: java url-encoding


【解决方案1】:

URLEncoder 不用于 URL,奇怪的是,它确实用于 URL arguments 和其他需要 application/x-www-form-urlencoded MIME 编码的东西。我发现对任意字符串 's' 进行 URL 编码的最简单方法是 new URI(null, s, null).toASCIIString()

【讨论】:

    【解决方案2】:

    您可以使用URLEncoder 并将所有+ 替换为%20

    另外,URLEncoder.encode(String s, String enc) 未被弃用。

    您也可以使用org.springframework.web.util.UriUtils.encodeUri

    【讨论】:

    • 啊我不知道,我以为是一般的 encode() 方法。真可惜,但看起来我必须按照您的建议将 + 替换为 %20 ......由于某种原因,它感觉不优雅。
    • 添加了更优雅的替代方案。
    • 因为我已经加载了 Spring,这也应该可以正常工作。我使用您的解决方案对其进行编码,然后发现它使用编码字符为文件提供服务......实际上我只需要将我的纯字符串用引号括起来。 O_o
    【解决方案3】:

    您最好使用new File( filename ).toURI().toURL()。这将为文件名创建正确的编码。它也适用于相对文件名和不存在的文件。实际上这个构造并不执行任何文件系统访问。

    【讨论】:

    • 这就像你提到的那样工作,但它提供了文件的完整路径。一点 lastIndexOf 魔法,它的工作原理是一样的。非常感谢!
    【解决方案4】:

    使用java.net.URLEncoder

    例如

    String s = "somestuff@%#$%^3<<>>";
    String encoded_string = URLEncoder.encode(s, "UTF-8");
    

    【讨论】:

    • 不能正确处理 URL 的空格,只处理 URL 参数。
    猜你喜欢
    • 1970-01-01
    • 2013-11-28
    • 2022-11-20
    • 2011-09-05
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2014-02-19
    • 2021-08-10
    相关资源
    最近更新 更多