我正在尝试在我的应用程序中使用来自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;
}
答案 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