文件名上的URL编码/解码用+替换空格,需要替代。

时间:2014-04-08 08:51:25

标签: java html utf-8

我的产品是一个网络应用程序 我有以后上传和下载的文件,往/来自我的服务器 我在上传带有unicode字符的文件时使用 java.net.URLDecoder.decode(),在下载文件时使用 java.net.URLDecoder.encode()以保存文件名,最后按预期返回客户端,没有问号和内容(?????)。

问题是,如果文件名包含空格,则编码/解码用 + 字符替换它们,这是完全正常的,因为这是他们的业务实现,但显然你可以理解它不是符合我的目的。
问题是我有什么办法可以克服这种情况? 是否有针对该方或第三方包的内置方法?

5 个答案:

答案 0 :(得分:3)

您不知道该文件名的使用位置。要编码的字符将是不同的,例如,它是在URI查询字符串还是片段部分。

你可能想看看番石榴(15.0+)Escaper;特别是UnicodeEscaper实现及其派生类PercentEscaper。 Guava已经提供了一些可用于URL的各个部分的内容。

编辑:这是如何处理番石榴:

public final class FilenameEscaper
    extends PercentEscaper
{
    public PercentEscaper()
    {
        super("", false);
    }
}

完成!见here。当然,您可能希望声明比默认字符多一些字符是安全的。

另请查看RFC 5987以制作更好的编码器。

答案 1 :(得分:3)

您还可以将空格转换为%20。

请参阅:URL encoding the space character: + or %20?

还有各种其他Java库使用%20进行URL编码。以下是两个例子:

番石榴:

UrlEscapers.urlPathSegmentEscaper().escape(urlToEscape);

Spring Framework:

UriUtils.encodePath(urlToEscape, Charsets.UTF_8.toString());

答案 2 :(得分:1)

这对我有用:

URLEncoder.encode(someString, "UTF-8").replace("+", "%20");

答案 3 :(得分:0)

我找到了治疗方法! 我只需要使用 java.net.URI

public static String encode(String urlString) throws UnsupportedEncodingException
{
    try
    {
        URI uri = new URI(urlString);
        return uri.toASCIIString();
    }
    catch (URISyntaxException e)
    {
        e.printStackTrace();
    }
}

toASCIIString()会转义特殊字符,因此当字符串到达​​浏览器时,它会正确显示。

答案 4 :(得分:0)

空间有同样的问题。 URL和URI的组合解决了它:

URL url = new URL("file:/E:/Program Files/IBM/SDP/runtimes/base");
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());

*请注意,URLEncoder用于网络表单application/x-www-form-urlencoded mime-type - 而不是http网络地址。

*来源:https://stackoverflow.com/a/749829/435605