2012-04-26 4 views
1

java로 pdf를 다운로드하려고 할 때 오류가 발생합니다. 비슷한 질문이 있지만 내 것과 같이 구체적이지는 않습니다. java.io.IOException : https를 통해 pdf를 다운로드하는 동안 조기 EOF

내 코드 :

URL url = new URL("https://.../abc.pdf"); 
HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
... 
InputStream in= conn.getInputStream(); 
ByteArrayOutputStream out = new ByteArrayOutputStream(4096); 
byte[] buf = new byte[4096]; 
int bytesRead = 0; 
while ((bytesRead = in.read(buf)) != -1) { 
    out.write(buf, 0, bytesRead); 
} 

THER 서버 응답 헤더 : (in.read(buf)에서)

X-AspNet-Version:2.0.50727 
Transfer-Encoding:chunked 
Date:Thu 26 Apr 2012 12:07:59 GMT 
Content-Disposition:attachment; filename=abc.pdf 
Set-Cookie:Language=en-gb; path=/ 
Connection:Keep-Alive 
Content-Type:application/octet-stream 
Server:Microsoft-IIS/6.0 
X-Powered-By:ASP.NET 
Cache-Control:private 

예외 :

Exception in thread "main" java.io.IOException: Premature EOF 
    at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:556) 
    at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:600) 
    at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:687) 
    at java.io.FilterInputStream.read(FilterInputStream.java:133) 
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2959) 
    at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:2953) 

코드는 거의 모든 경우에 작동하고 있었다 수천 번 사용되었습니다. 그러나 매우 드문 경우에이 예외가 발생합니다. 그러나 나는 브라우저로 pdf를 다운로드 할 수있다. 또한 pdf를 내 서버에 저장하면 코드로 다운로드 할 수 있습니다. 따라서 서버가이 pdf를 제공하는 방식으로해야 할 일이 있어야합니다.

어쩌면 Transfer-Encoding:chunked과 관련이 있습니까?

누구나 아이디어가 있습니까?이 문제를 해결하기 위해 무엇을 시도 할 수 있습니까?

답변

3

java 청크 처리와 관련된 버그로 보입니다. 한 번에 한 바이트 씩 읽고 EOFException에 대한 try-catch에 읽음으로써 많은 문제를 해결했습니다.

+1

버퍼 크기를 1 :'byte [] buf = new byte [1];로 설정하려고했지만 동일한 예외가 발생합니다. 나는 지금 try catch를 시도 할 것이다. – morja

+0

예외를 무시하면 실제로 작동하지만 스트림은 여전히 ​​완전히로드됩니다. 더 큰 버퍼를 사용합니다. 힌트를 주셔서 감사합니다! 버퍼가 1이 아닌 경우 문제가 발생할 수 있다고 생각합니까? 예외를 무시하는 것에 의지 할 수 있습니까? – morja

+0

첫 번째 청크에서만 버그가 발생하면 (문제는 아님) 예외는 무시하십시오. 일반적으로 : 예. – Luca

0

이 코드가 필요하다고 생각합니다.

try { 
}catch(IOException e) { 
} finally { 
    try { 
    if (in != null) 
     in.close(); 
    }catch(Exception e) { 
    } 
} 

또는 Apache 라이브러리에서 IOUtils.close를 사용해보십시오.

finally { 
    IOUtils.close(in); 
    } 

나는 비슷한 일이 있었다. 하지만 지금 고쳐 줬어.

관련 문제