我的产品是一个网络应用程序
我有以后上传和下载的文件,往/来自我的服务器
我在上传带有unicode字符的文件时使用 java.net.URLDecoder.decode(),在下载文件时使用 java.net.URLDecoder.encode()以保存文件名,最后按预期返回客户端,没有问号和内容(?????)。
问题是,如果文件名包含空格,则编码/解码用 + 字符替换它们,这是完全正常的,因为这是他们的业务实现,但显然你可以理解它不是符合我的目的。
问题是我有什么办法可以克服这种情况?
是否有针对该方或第三方包的内置方法?
答案 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网络地址。