Java 检查HTTP请求中的图像有效性
我在推特上画图片。可通过以下URL访问图像: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 =
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数据:数据段过早结束”。