使用Java从Web下载生成的图像

时间:2016-05-30 06:01:55

标签: javascript java android httpurlconnection

我正在尝试在我的应用程序中使用来自http://avatars.adorable.io/的头像。但是,当尝试下载例如以下png:http://api.adorable.io/avatars/285/bla.png时,我的HttpUrlConnection表示内容长度为0。

当我在浏览器中乱搞时,我想我发现该网站使用了一些脚本来生成头像,我认为它可能在客户端。但是,我对此并不是很了解,也无法轻易找到答案。

是否可以使用以下代码在Java应用程序中下载其中一个头像?

private Pixmap syncDownloadPixmapFromURL(URL url) 
{   
    URLConnection conn;
    try 
    {
        conn = url.openConnection();
        conn.setDoInput(true);
        conn.setDoOutput(false);
        conn.setUseCaches(true);
        conn.connect();
        int length = conn.getContentLength();
        if(length<=0) 
        {
            System.out.log("content length = 0!");
            return null;
        }
        InputStream is = conn.getInputStream();
        conn.setConnectTimeout(5000);
        DataInputStream dis = new DataInputStream(is);
        byte[] data = new byte[length];
        dis.readFully(data);
        dis.close();
        Pixmap pixmap = new Pixmap(data, 0, data.length);
        return pixmap;
    } 
    catch (MalformedURLException e) 
    {   
        e.printStackTrace();
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }

    return null;
 }

1 个答案:

答案 0 :(得分:1)

这是因为服务器没有发送内容长度。服务器不必强制执行此操作。正如您所提到的,他们使用的脚本动态创建内容并“动态”编写数据。他们编写内容以将其添加为标题时,他们不知道数据的长度。

Connection:keep-alive
Content-Type:image/png
Date:Mon, 30 May 2016 06:12:49 GMT
Expires:Mon Jun 06 2016 06:12:49 GMT+0000 (UTC)
Server:Cowboy
Transfer-Encoding:chunked
Via:1.1 vegur
X-Powered-By:Express

您可以将流假脱机到ByteArrayOutputStream中,然后从中获取字节数组。

或者你可以使用类似Apache Commons IO的东西,它有一个方法可以为你处理...

byte[] data = IOUtils.toByteArray(conn.getInputStream());

有关其他实施的信息,请参阅此答案:Convert InputStream to byte array in Java