2014-10-06 4 views
1

트위터에서 이미지를 끌어옵니다. 이미지는 형태의 URL에서 도달 할 수 있습니다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

답변

1

httpConnection 객체 대신 url 객체에서 getInputStream()을 호출하고 있다는 오류가 발생했다고 생각합니다. 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 개 코드를 확인해야하는 당신은하고있는 중이지만, 곱슬 곱슬하거나 다른 것으로 뭔가를 확인해보고 싶다면 중간에 프록시가 없다는 것을 확인해보십시오.

+0

실례합니다.하지만 오류 코드 대신 확인하고 싶은 내용을 이해하지 못했습니다. – Eleanore

+0

응답 코드를 확인하는 방법은 괜찮은 것처럼 보입니다.하지만 (a) 무언가를 변경하는 프록시가있을 수 있으며 (b) openStream이 상태 코드를 확인하는 것과는 별도의 연결에 있습니다. . – FrobberOfBits

+0

당신의 제안 (즉,'httpConnection.getInputStream()')에 따라'InputStream'이 연결에서 가져 왔고 처음부터 다시 생성되지 않도록 코드를 변경했습니다. 희망이 문제를 해결합니다. – Eleanore

관련 문제