1

Java で PDF をダウンロードしようとすると、エラーが発生します。同様の質問があることは知っていますが、私のものほど具体的ではありません。

私のコードスニペット:

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を提供する方法に何か関係があるに違いありません。

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

これを修正するために私ができることはありますか?

4

2 に答える 2

4

Java のチャンク処理に関するバグのようです。多くは、一度に 1 バイトずつ読み取り、その読み取りを EOFException の try-catch に入れることで解決しました。

于 2012-04-26T12:40:40.440 に答える