2012-04-26 65 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サーバのレスポンスヘッダ:

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 

例外(in.read(buf)で):コードは、ほぼすべてのケースのために働いていた

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をダウンロードできます。だからそれはサーバーがこのpdfを提供する方法でやり遂げる何かを持っている必要があります。

多分それはTransfer-Encoding:chunkedと関係がありますか?

誰かがアイデアを持っていますが、これを解決するために何ができるのですか?

答えて

3

Javaチャンク処理に関連するバグのようです。多くの場合、一度に1バイトを読み込み、EOFExceptionのtry-catchに読み込みを行います。

+1

バッファサイズを1: 'byte [] buf = new byte [1];に設定しようとしましたが、同じ例外が発生します。私は今tryキャッチしようとします。 – 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); 
    } 

私は同じことが起こりました。今はそれを修正しました。

関連する問題