1

ファイルが特定のコンテンツ タイプである場合、URL からファイルをダウンロードしようとしています。URL は html ページまたは pdf ページのいずれかを提供できますが、pdf ファイルのみを保存したいと考えています。これを行う私の試みは以下のとおりです。

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD");
connection.connect();
String contentType = connection.getContentType();

if (contentType.equals("application/pdf")) {
      org.apache.commons.io.FileUtils.copyURLToFile(url, file);
}

contentType は正しく取得されていますが、呼び出しcopyURLToFile(url,file);により次の例外が発生します。

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(Unknown Source)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(Unknown Source)
at com.sun.net.ssl.internal.ssl.InputRecord.read(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(Unknown Source)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(Unknown Source)
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1025)
at org.apache.commons.io.IOUtils.copy(IOUtils.java:999)
at org.apache.commons.io.FileUtils.copyURLToFile(FileUtils.java:848)

contentType を取得するためのコード行を削除し、 を呼び出すだけcopyURLToFile(url,file)で、ファイルがダウンロードされ、正常に保存されます。HttpURLConnection接続がリセットされる原因となる何らかの方法で 私の取り扱いを誤っていますか?

if(contentType.equals("application/pdf")また、回線にブレークポイントを設定して数秒待つと、接続がリセットされることなく呼び出しがcopyURLToFile成功することにも気付きました。常に失敗するある種の競合状態を導入していますか?

4

2 に答える 2

2

HEAD を読んだ後、接続を閉じてみませんか?

   HttpURLConnection connection = (HttpURLConnection) url.openConnection();
   connection.setRequestMethod("HEAD");
   connection.connect();
   String contentType = connection.getContentType();
   connection.close();

その後、FileUtils は新しい接続を開く必要があり、問題が解決される可能性があります。

于 2012-11-21T13:48:06.690 に答える
2

データを読み取るには、オープン接続を使用する必要があります。

org.apache.commons.io.IOUtils.copy(connection.getInputStream(), new FileOutputStream(file));

別の接続を開く必要はありません。おそらくサーバーが接続をリセットしますか?

編集:リクエストメソッドの設定はしませんでしたが、GETを使用するとこれが機能します:

public static void main(String args[]) throws IOException{
    URL url = new URL("http://www.google.com");
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("GET");
    String contentType = connection.getContentType();
    System.out.println("content-type: " + contentType);
    IOUtils.copy(connection.getInputStream(), new FileOutputStream("/temp/test.html"));
}

編集: または、最初に HEAD リクエストでヘッダーを確認する場合:

URL url = new URL("http://www.google.com");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("HEAD");
String contentType = connection.getContentType();
System.out.println("content-type: " + contentType);
connection.disconnect();
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
IOUtils.copy(connection.getInputStream(), new FileOutputStream("/temp/test.html"));
connection.disconnect();
于 2012-11-21T13:53:12.960 に答える