LoginSignup
2
4

More than 3 years have passed since last update.

Java:ファイルをダウンロードしてダイアログで選択した場所に保存する[HttpClient使用]

Last updated at Posted at 2019-05-09

はじめに

さてさて、業務にてJavaのローカルアプリで以下の動きを実装することになりました。
1. 保存先を選択するダイアログを開く
2. 選択した保存先に指定のURLからダウンロードしたファイルを保存
結構よくありそうな処理なので、そのままコピペ使えそうな記事が無いかなと調べてみたところ、ダイアログを開くURLからファイルをダウンロードして保存するといった各々の処理についての記事はありましたが、まとまったものが見当たらず。
せっかくなので組み合わせて書いてみました。

以下サンプル

  • 今回はHttp通信にapache.httpComponentsを使用しています。
pom.xml
<!-- 省略 -->
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.5.2</version>
    </dependency>
<!-- 省略 -->
DownloadSample.java
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.swing.JFileChooser;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class DownloadSample {
  // ダウンロード先のURL
  static String downloadUrl = "http://sample.com/hoge.txt";

  public static void main(String[] args) throws IOException {
    // デフォルトのファイル名をURLから取得します。
    URL url = new URL(downloadUrl);
    String fileName = Paths.get(url.getPath()).getFileName().toString();

    // 保存ダイアログの表示
    JFileChooser filechooser = new JFileChooser(fileName);
    // デフォルトのファイル名を指定
    filechooser.setSelectedFile(new File(fileName));
    // 保存ダイアログを表示
    if (filechooser.showSaveDialog(null) != JFileChooser.APPROVE_OPTION) {
      // 「保存」以外を押されたら終了
      return;
    }
    // 保存先を設定
    File saveFile = filechooser.getSelectedFile();
    try (
        // HttpClientを設定
        final CloseableHttpClient client = HttpClients.createDefault();
        // Get
        final CloseableHttpResponse response = client.execute(new HttpGet(downloadUrl))) {
      // statusを確認して通信成功したらファイル保存
      final int status = response.getStatusLine().getStatusCode();
      if (status >= 200 && status < 300) {
        final HttpEntity entity = response.getEntity();
        // ファイル保存
        Files.write(Paths.get(saveFile.toString()),
            entity == null ? new byte[0] : EntityUtils.toByteArray(entity));
      } else {
        throw new ClientProtocolException("Unexpected response status: " + status);
      }
    }
  }
}

本当にこれだけのサンプルなので不要かもしれませんが...GitHub

参考文献

[Java] ファイルをダウンロードして保存する(Apache HttpComponents HttpClient 4.5.2使用)
→ Http通信とファイル保存については、ほとんどこちらの記事から流用させていただきました。ありがとうございます!
「ファイルを保存する」ダイアログを表示する
JFileChooserを便利に使うためのTips
 → 保存ダイアログの選択方法についてはこちらの記事を参考にさせていただきました。ありがとうございます!
java.net.URLの使い方とちょっとNIO.2のメモ
 →URLからファイル名を取得する処理についてはこちらの記事を参考にさせていただきました。ありがとうございます!

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4