检查HTTP请求中的图像有效性

时间:2014-10-06 12:53:47

标签: java image http connection

我在Twitter上画图像。可以从以下格式的URL访问图像:

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()生成。

如何防止这种情况发生?如何检查图像有效性?

1 个答案:

答案 0 :(得分:1)

我认为您的错误是您在getInputStream()对象上调用url,而不是httpConnection对象。通过您的httpConnection对象,您已经连接到服务器并阅读响应代码。同一个对象有一个openStream()方法,我认为你应该使用它。

至少,您的代码看起来可能会产生每个图像而不是一个连接生成2个连接的副作用。

此外,在您有问题的网址上,这些是我看到从服务器返回的标头:

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或其他方法对此进行双重检查,以验证您没有代理人在中间做了一些奇怪的事。