下载网址格式错误的图片

时间:2018-07-11 17:54:18

标签: java java-8

我正在尝试下载在给定网站上找到的任何给定图像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)
    {...}

在考虑潜在的丢失协议的情况下,还有更好的方法吗?

3 个答案:

答案 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页面会导致错误)