2014-10-06 16 views
1

我從Twitter中提取圖像。這些圖像可達來自網址形式:檢查HTTP請求中的圖像有效性

https://pbs.twimg.com/media/BzQXyBJIAAIU6D0.jpg 

爲了獲取圖像,我採用下面的代碼:

HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection(); 
httpConnection.setRequestMethod ("GET"); 
httpConnection.connect(); 

int code = httpConnection.getResponseCode(); 

if (code == HttpURLConnection.HTTP_OK){ 
    InputStream is = url.openStream(); 
    OutputStream os = new FileOutputStream(destinationFile); 

    byte[] b = new byte[2048]; 
    int length; 

    while ((length = is.read(b)) != -1) { 
     os.write(b, 0, length); 
    } 

    is.close(); 
    os.close(); 

    httpConnection.disconnect(); 
} 

然而,有時會發生圖像像這樣:

https://pbs.twimg.com/media/By_ui7QIgAE021Z.jpg 

在某種程度上是畸形的,雖然code=200,我在這裏發佈的代碼不起作用,錯誤:

Corrupt JPEG data: premature end of data segment 
java.io.FileNotFoundException: https://pbs.twimg.com/media/By_ui7QIgAE021Z.jpg 

例外情況由指令openStream()生成。

如何防止這種情況發生?如何檢查圖像有效性?

+0

您的代碼與輸出不匹配。您的代碼示例中沒有任何內容能夠輸出「損壞的JPEG數據:數據段過早結束」。 – jarnbjo 2014-10-06 14:39:31

回答

1

,我認爲你的錯誤是,你的url調用對象的getInputStream(),而不是你的httpConnection對象。通過您的httpConnection對象,您已連接到服務器並讀取響應代碼。同一個對象有一個openStream()方法,我認爲你應該使用它。

至少,它看起來像你的代碼可能會產生副作用,每個圖像生成2個連接,而不是一個。

而且,在你有問題的URL,這些都是我看到從服務器回來標題:

HTTP/1.1 404 Not Found 
Date: Mon, 06 Oct 2014 13:05:32 GMT 
Server: tfe 
cache-control: max-age=5, must-revalidate 
content-security-policy-report-only: default-src 'none'; img-src https://abs.twimg.com https://ssl.google-analytics.com; script-src https://abs.twimg.com https://ssl.google-analytics.com about:; style-src https://abs.twimg.com 'unsafe-inline'; font-src https://abs.twimg.com https://twitter.com;connect-src 'none'; object-src 'none'; media-src 'none'; frame-src 'none'; report-uri https://twitter.com/i/csp_report?a=ORTGK%3D%3D%3D&ro=false 
x-xss-protection: 1; mode=block 
Content-Type: image/jpeg 
Content-Length: 4311 

因此,你應該檢查非HTTP的響應... 200碼,其你在做,但你可能想用curl或其他東西來檢查這個,以確認你在中間沒有代理做奇怪的事情。

+0

請原諒我,但我不明白你建議檢查(而不是錯誤代碼)。 – Eleanore 2014-10-06 13:15:00

+0

您檢查響應代碼的方式對我來說看起來不錯 - 但是(a)您可能有代理正在更改某些內容,(b)openStream與您正在檢查狀態代碼的連接不在同一個連接上。 – FrobberOfBits 2014-10-06 13:16:07

+0

我已經更改了代碼,以便根據您的建議(即'httpConnection.getInputStream()')從連接中獲取'InputStream',而不是從頭開始重新創建。希望這能解決這個問題。 – Eleanore 2014-10-06 13:19:27