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
と関係がありますか?
誰かがアイデアを持っていますが、これを解決するために何ができるのですか?
バッファサイズを1: 'byte [] buf = new byte [1];に設定しようとしましたが、同じ例外が発生します。私は今tryキャッチしようとします。 – morja
例外を無視すると、実際にはストリームが完全に読み込まれます。より大きなバッファでも。ヒントありがとう!バッファが1でない場合、問題が発生する場合がありますか?私は例外を無視することに頼ることができますか? – morja
最初のチャンクでのみバグが発生した場合(問題ありません)、問題はありませんが、例外は無視されます。一般的には:はい。 – Luca