質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

一回目のダウンロードはうまくいくが、次のダウンロードがうまくいかない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 856

score -23

ダンロードするクラスをつくりました。

import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;


public class DownloadAndSave
{
    private String szURL;
    private String szSaveFilename;

    public DownloadAndSave() { }
    public void go()
    {
        try {
            URL url = new URL( szURL );

            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setAllowUserInteraction(false);
            conn.setInstanceFollowRedirects(true);
            conn.setRequestMethod("GET");
            conn.connect();

            int httpStatusCode = conn.getResponseCode();

            switch(httpStatusCode)
            {
            case HttpURLConnection.HTTP_ACCEPTED:
                System.out.println("ACCEPTED");    break;
            case HttpURLConnection.HTTP_BAD_GATEWAY:
                System.out.println("HTTP_BAD_GATEWAY");    break;
            case HttpURLConnection.HTTP_BAD_METHOD:
                System.out.println("HTTP_BAD_METHOD");    break;
            case HttpURLConnection.HTTP_BAD_REQUEST:
                System.out.println("HTTP_BAD_REQUEST");    break;
            case HttpURLConnection.HTTP_CLIENT_TIMEOUT:
                System.out.println("HTTP_CLIENT_TIMEOUT");    break;
            case HttpURLConnection.HTTP_CONFLICT:
                System.out.println("HTTP_CONFLICT");    break;
            case HttpURLConnection.HTTP_CREATED:
                System.out.println("HTTP_CREATED");    break;
            case HttpURLConnection.HTTP_ENTITY_TOO_LARGE:
                System.out.println("HTTP_ENTITY_TOO_LARGE");    break;
            case HttpURLConnection.HTTP_FORBIDDEN:
                System.out.println("HTTP_FORBIDDEN");    break;
            case HttpURLConnection.HTTP_GATEWAY_TIMEOUT:
                System.out.println("HTTP_GATEWAY_TIMEOUT");    break;
            case HttpURLConnection.HTTP_GONE:
                System.out.println("HTTP_GONE");    break;
            case HttpURLConnection.HTTP_INTERNAL_ERROR:
                System.out.println("HTTP_INTERNAL_ERROR");    break;
            case HttpURLConnection.HTTP_LENGTH_REQUIRED:
                System.out.println("HTTP_LENGTH_REQUIRED");    break;
            case HttpURLConnection.HTTP_MOVED_PERM:
                System.out.println("HTTP_MOVED_PERM");    break;
            case HttpURLConnection.HTTP_MOVED_TEMP:
                System.out.println("HTTP_MOVED_TEMP");    break;
            case HttpURLConnection.HTTP_MULT_CHOICE:
                System.out.println("HTTP_MULT_CHOICE");    break;
            case HttpURLConnection.HTTP_NO_CONTENT:
                System.out.println("HTTP_NO_CONTENT");    break;
            case HttpURLConnection.HTTP_NOT_ACCEPTABLE:
                System.out.println("HTTP_NOT_ACCEPTABLE");    break;
            case HttpURLConnection.HTTP_NOT_AUTHORITATIVE:
                System.out.println("HTTP_NOT_AUTHORITATIVE");    break;
            case HttpURLConnection.HTTP_NOT_FOUND:
                System.out.println("HTTP_NOT_FOUND");    break;
            case HttpURLConnection.HTTP_NOT_IMPLEMENTED:
                System.out.println("HTTP_NOT_IMPLEMENTED");    break;
            case HttpURLConnection.HTTP_OK:
                System.out.println("HTTP_OK");    break;
            case HttpURLConnection.HTTP_PARTIAL:
                System.out.println("HTTP_PARTIAL");    break;
            case HttpURLConnection.HTTP_PAYMENT_REQUIRED:
                System.out.println("HTTP_PAYMENT_REQUIRED");    break;
            case HttpURLConnection.HTTP_PRECON_FAILED:
                System.out.println("HTTP_PRECON_FAILED");    break;
            case HttpURLConnection.HTTP_PROXY_AUTH:
                System.out.println("HTTP_PROXY_AUTH");    break;
            case HttpURLConnection.HTTP_REQ_TOO_LONG:
                System.out.println("HTTP_REQ_TOO_LONG");    break;
            case HttpURLConnection.HTTP_RESET:
                System.out.println("HTTP_RESET");    break;
            case HttpURLConnection.HTTP_SEE_OTHER:
                System.out.println("HTTP_SEE_OTHER");    break;
            case HttpURLConnection.HTTP_UNAUTHORIZED:
                System.out.println("HTTP_UNAUTHORIZED");    break;
            case HttpURLConnection.HTTP_UNAVAILABLE:
                System.out.println("HTTP_UNAVAILABLE");    break;
            case HttpURLConnection.HTTP_UNSUPPORTED_TYPE:
                System.out.println("HTTP_UNSUPPORTED_TYPE");    break;
            case HttpURLConnection.HTTP_USE_PROXY:
                System.out.println("HTTP_USE_PROXY");    break;
            case HttpURLConnection.HTTP_VERSION:
                System.out.println("HTTP_VERSION");break;

            }
            if( httpStatusCode != HttpURLConnection.HTTP_OK ) {
                System.out.println("[INFO] HTTP_OK error" );
                throw new Exception();
            }

            //  InputStream
            DataInputStream dataInStream = new DataInputStream( conn.getInputStream() );
            //  OutputStream
            DataOutputStream dataOutStream = new DataOutputStream( new BufferedOutputStream(
                new FileOutputStream( szSaveFilename ) ) );

            //  Read Data
            byte[] b = new byte[4096];
            int readByte = 0;
            while( -1 != (readByte = dataInStream.read(b))) {
                dataOutStream.write(b,0,readByte);
            }
            System.out.println(" DownloadAndSave - END -" );
            //  Close Stream
            dataInStream.close();
            dataOutStream.close();
            conn.disconnect();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (ProtocolException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void setInfo( String szURL, String szSaveFilename )
    {
        this.szURL = szURL;
        this.szSaveFilename = szSaveFilename;
    }
}
public class セイバーたんの画像をダウンロードする {

    public static void Step1()
    {
    }

    public static void Step2()
    {
    }
    public static void main(String[] args) {
        // TODO 自動生成されたメソッド・スタブ
        DownloadAndSave node = new DownloadAndSave();
        node.setInfo( "http://google.co.jp", "google.txt" );
        node.go();

        node.setInfo( "http://www.yahoo.co.jp",  "yahoo.co.jp" );
        node.go();
    }

}


実行結果


HTTP_OK
DownloadAndSave - END -
HTTP_MOVED_PERM
[INFO] HTTP_OK error
java.lang.Exception
at DownloadAndSave.go(DownloadAndSave.java:107)
at セイバーたんの画像をダウンロードする.main(セイバーたんの画像をダウンロードする.java:18)

main での
DownloadAndSave node = new DownloadAndSave();
node.setInfo( "http://google.co.jp", "google.txt" );
node.go();

node.setInfo( "http://www.yahoo.co.jp",  "yahoo.co.jp" );
node.go();
で2回目の node.go(); で必ず失敗します。
エラーの対処方法がわかりません。どうしたらいいでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ngsvx

    2019/10/23 14:32

    対処するには、原因がわからないといけませんが、原因は自分で把握していますか?

    キャンセル

  • yukkuri_55

    2019/10/23 15:54

    Javaのプログラムコードには問題がないように思えるので(一回目が成功している)
    原因がわかりません。

    キャンセル

回答 2

checkベストアンサー

0

ちゃんとデバッグ出力しているのでレスポンスコードが以下のように出力されていますね。

HTTP_MOVED_PERM
[INFO] HTTP_OK error

Moved Permanentlyというステータスなのですが、
アクセスしたURLから別なURLにリダイレクトするように設定されている場合に返るステータスになります。
301 Moved Permanently

開発者ツールで通信状態を確認すると、httpからhttpsにリダイレクトしているようです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/23 16:54

    http://www.yahoo.co.jp から https://www.yahoo.co.jp に変更したところ
    うまくyahoo.txtが取得できました。
    解決しました。

    キャンセル

-1

main での
DownloadAndSave node = new DownloadAndSave();
 node.setInfo( "http://google.co.jp", "google.txt" );
 node.go(); 

node.setInfo( "http://www.yahoo.co.jp",  "yahoo.co.jp" );
 node.go();
で2回目の node.go(); で必ず失敗します。

2回目のnode.setInfoの第二引数にファイル名でなくyahoo.co.jpを指定しているからでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/23 15:55

    "yahoo.co.jp" を "yahoo.txt" に変更してもうまくいきませんでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る