应用场景
SVN上存放了一个Excel文件A.xlsx,随时都可以会更新其中的数据。我要用该A.xlsx作为数据源,读取数据并显示在一个web页面上。
原文件路径
http://192.168.81.33:8080/svn/SVN_DB/Sender/doc/wireless5.5/H5 url 跳转相关内容/5.5Hybird跳转URL列表.xlsx
浏览器编码之后的文件路径
可以明确的知道是用了UTF-8编码;用HttpURLConnection直接访问下面的路径,可以正确的获取到数据。
用Java的URLEncode编码原路径得到的结果如下
这里也用了UTF-8编码;用HttpURLConnection直接访问下面的路径,返回404 Not Found 。
http%3A%2F%2F192.168.81.33%3A8080%2Fsvn%2FSVN_DB%2FSender%2Fdoc%2Fwireless5.5%2FH5+url+%E8%B7%B3%E8%BD%AC%E7%9B%B8%E5%85%B3%E5%86%85%E5%AE%B9%2F5.5Hybird%E8%B7%B3%E8%BD%ACURL%E5%88%97%E8%A1%A8.xlsx
修改方法
用编码过后的URL差异看出
- Java的URLEncode对原URL中的“:”“/”也做了编码
- 另外Java的URLEncode对原URL中的空格编码之后的值是“+”。而浏览器对URL中空格的编码值是“%20”;
- 经过测试Java的URLEncode对“+”编码之后的值是%2B
于是自己实现了如下的Java版的URL编码函数:
private String encodeURL(String url,String encode)
{
if(url == null || url.length() <= 0) return null;
URL temp;
String encodedUrl="";
try {
temp = new URL(url);
encodedUrl += temp.getProtocol();
encodedUrl += "://"+temp.getHost()+":";
encodedUrl += temp.getPort();
String path = temp.getPath();
String[] paths = path.split("/");
for(String str : paths)
{
str = URLEncoder.encode(str,encode);
encodedUrl += str+"/";
}
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return encodedUrl.substring(0,encodedUrl.length()-1).replace("+", "%20");
}