2014-10-19 66 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