2014-10-19 75 views
1

图片我使用Apache的HttpClient执行GET/POST请求,HttpClient的得到响应

我在想,如果你可以节省通过加载的响应/检索,图像,而无需与他们的网址重新下载。

这个问题已经被问像一年前,但没有人回答: Can I get cached images using HttpClient?

我想:

CloseableHttpClient httpclient = HttpClients.createDefault(); 

HttpGet httpget = new HttpGet(url); 

HttpResponse response = httpclient.execute(httpget); 
HttpEntity entity = response.getEntity(); 

InputStream is = entity.getContent(); 

FileOutputStream fos = new FileOutputStream(new File("img.png")); 
int inByte; 
while ((inByte = is.read()) != -1) { 
    fos.write(inByte); 
} 
is.close(); 
fos.close(); 

但显然它的下载只有文字,我可以做的是HttpClient下载图片不是特定的URL? 这是否可行?

回答

0

网页只是页面的HTML代码。

当浏览器访问网页时,它下载HTML代码,然后解析HTML。如果存在诸如IMG标签,嵌入对象(如Flash,Applets等),框架等等,浏览器将获取它们的URL并创建一个新的HTTP连接,并在其中下载图像。它为每个图像都这样做。然后,将页面的各个部分都准备好(缓存中),然后呈现页面。

这是一个简化的描述,当然,浏览器倾向于通过保持连接打开并保持缓存来优化这些事情。所以要重申,要在一个页面中获取图像:

  1. 从给定的URL下载HTML。
  2. 解析HTML并找到IMG标签。
  3. 对于每个相关的IMG,从与其关联的SRC URL下载图像数据。你应该将它们保存到一个文件中。

重要的是要明白,HttpClient响应只表示一个对象 - HTML页面或单个图像,具体取决于您提供的URL。如果您要下载整个页面及其所有图像,则必须为每个对象自己使用HttpClient - 它不会自动执行。

+0

好吧,我明白了,但让我们以一个验证码为例,当你单独下载图像时,你会得到一个新的图像,对吧? – 2014-10-19 13:09:15

+0

是的。但是你看,你甚至没有下载过它。直到您访问其直接网址时才会生成。一旦你用'HttpClient'完成了,你可以把它保存在一个文件中,如果你愿意,可以不再访问它。 – RealSkeptic 2014-10-19 13:14:15

+0

好的,谢谢,我会试试看。 – 2014-10-19 13:18:14