我在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()
生成。
如何防止这种情况发生?如何检查图像有效性?
答案 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或其他方法对此进行双重检查,以验证您没有代理人在中间做了一些奇怪的事。