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

Java 检查HTTP请求中的图像有效性,java,image,http,connection,Java,Image,Http,Connection,我在推特上画图片。可通过以下URL访问图像: https://pbs.twimg.com/media/BzQXyBJIAAIU6D0.jpg 为了检索图像,我应用以下代码: HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection (); httpConnection.setRequestMethod ("GET"); httpConnection.connect(); int code =

我在推特上画图片。可通过以下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()
生成


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

我认为您的错误是,您在
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代码,但是你可能想用卷曲或其他东西来检查这两个代码,以验证中间没有代理做一些奇怪的事情。对不起,对不起,我不明白你建议检查什么(而不是错误代码)。。您检查响应代码的方式在我看来还行-但是(a)您可能有一个正在更改某些内容的代理,并且(b)openStream与您检查状态代码的连接不同。我已更改了代码,以便

InputStream
从连接中获取,而不是从头开始重新创建,根据您的建议(即,
httpConnection.getInputStream()
)。希望这能解决问题。您的代码与输出不匹配。您的代码示例中没有任何内容能够输出“损坏的JPEG数据:数据段过早结束”。