2014-10-06 37 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