我正在尝试下载在给定网站上找到的任何给定图像URL。我遇到的问题是以下形式的URL:
<img src="//domain.com/img/logo.png">
如上所述,图像url缺少协议,当尝试使用以下代码段下载内容时,将导致格式错误的URL异常:
ByteArrayOutputStream output = new ByteArrayOutputStream();
URLConnection connection;
try
{
connection = new URL(url).openConnection();
connection.connect();
}
catch (Exception e)
{...}
try (final InputStream inputStream = connection.getInputStream())
{
int bytesRead;
byte[] buffer = new byte[4096];
while ((bytesRead = inputStream.read(buffer)) > 0)
{
output.write(buffer, 0, bytesRead);
}
}
catch (Exception e)
{...}
在考虑潜在的丢失协议的情况下,还有更好的方法吗?
答案 0 :(得分:1)
尝试检查协议,如果不存在,请将其添加到网址中。
public String handleUrl(String url, boolean secure){
if(url.startsWith("//"){
if(secure){
url = "https:"+url;
} else {
url = "http:"+url;
}
}
if(!secure&&!url.startsWith("http://"){
url = "http://"+url;
}
if(secure&&!url.startsWith("https://"){
url = "https://"+url;
}
return url;
}
要检查URL是否有效,请使用URLValidator
:
UrlValidator urlValidator = new UrlValidator();
urlValidator.isValid(URL);
答案 1 :(得分:0)
除了已经在另一个答案中显示的检查和修复(因此,从代码中添加协议,如果缺少协议的话)方法之外,我将指向openStream()
。假设这是一个安全的方法,不会泄漏,依此类推,您可以摆脱一个try-with-resources块,并希望InputStream
正确关闭连接(您甚至不会接触到该连接)这种情况):
if(url.startsWith("//"))
url="http:"+url;
ByteArrayOutputStream output = new ByteArrayOutputStream();
try (final InputStream inputStream = new URL(url).openStream())
{
int bytesRead;
byte[] buffer = new byte[4096];
while ((bytesRead = inputStream.read(buffer)) > 0)
{
output.write(buffer, 0, bytesRead);
}
}
catch (Exception e)
{...}
我只是在此处硬编码http,重点是try-block。
答案 2 :(得分:0)
图像没有嵌入格式错误的URI。它们在已生成的上下文中有效。它们是相对的URI,如下所示:
#
(单个null锚引用)这类URI出现在可以在几种不同上下文中下载的文档中(因此,缺少的信息必须由提供该信息的下载者提供)。例如,如果您下载具有相对引用的文档,则可以使用类似于以下内容的文件:
../other_place/index.asp?page_index=3#footer_marker
作为绝对URI有效吗?不是,您需要根据您首先下载的文档(例如
)提供所有缺失的部分。https://www.example.com/first_place/index.html#top
您应该将其替换为:
https://www.example.com/other_place/index.asp?page_index=3#footer_marker
但是如果您从以下位置得到它:
ftp://user:password@ftp.example.com/public/distribution/first_place/index.html#top
您应该改用:
ftp://user:password@ftp.example.com/public/distribution/other_place/index.asp#footer_marker
(请注意,ftp不知道查询字符串,因此可能要求输入asp页面会导致错误)