1. 概要

このクイックチュートリアルは、SpringのRestTemplateを使用してマルチパートファイルをアップロードする方法に焦点を当てています。

単一のファイルと複数のファイルの両方が表示されます–RestTemplateを使用してをアップロードします。

2. HTTPマルチパートリクエストとは何ですか?

簡単に言うと、基本的なHTTP POSTリクエストの本文は、フォームデータを名前と値のペアで保持します。

一方、HTTPクライアントは、テキストまたはバイナリファイルをサーバーに送信するためのHTTPマルチパートリクエストを作成できます。 主にファイルのアップロードに使用されます。

もう1つの一般的な使用例は、添付ファイル付きの電子メールを送信することです。 マルチパートファイルリクエストは、大きなファイルを小さなチャンクに分割し、境界マーカーを使用してブロックの開始と終了を示します。

マルチパートリクエストの詳細については、こちらをご覧ください。

3. Mavenの依存関係

この単一の依存関係は、クライアントアプリケーションには十分です。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

4. ファイルアップロードサーバー

ファイルサーバーAPIは、単一ファイルと複数ファイルをそれぞれアップロードするための2つのRESTエンドポイントを公開します。

  • POST / fileserver / singlefileupload /
  • POST / fileserver / multiplefileupload /

5. 単一ファイルのアップロード

まず、見てみましょう RestTemplateを使用した単一ファイルのアップロード。

ヘッダーと本文を使用してHttpEntityを作成する必要があります。 content-typeヘッダー値をMediaType.MULTIPART_FORM_DATAに設定します。 このヘッダーが設定されると、RestTemplateはいくつかのメタデータとともにファイルデータを自動的にマーシャリングします。

メタデータには、ファイル名、ファイルサイズ、ファイルコンテンツタイプ( text / plain など)が含まれます。

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);

次に、LinkedMultiValueMapクラスのインスタンスとしてリクエスト本文を作成します。 LinkedMultiValueMap は、 LinkedHashMap をラップし、LinkedInListの各キーに複数の値を格納します。

この例では、 getTestFile()メソッドはその場でダミーファイルを生成し、FileSystemResourceを返します。

MultiValueMap<String, Object> body
  = new LinkedMultiValueMap<>();
body.add("file", getTestFile());

最後に、ヘッダーと本体オブジェクトをラップする HttpEntity インスタンスを作成し、RestTemplateを使用して投稿します。

単一ファイルのアップロードは、 / fileserver / singlefileupload/エンドポイントを指していることに注意してください。

最後に、 restTemplate.postForEntity()の呼び出しは、指定されたURLに接続し、ファイルをサーバーに送信するジョブを完了します。

HttpEntity<MultiValueMap<String, Object>> requestEntity
 = new HttpEntity<>(body, headers);

String serverUrl = "http://localhost:8082/spring-rest/fileserver/singlefileupload/";

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate
  .postForEntity(serverUrl, requestEntity, String.class);

6. 複数のファイルをアップロードする

複数ファイルのアップロードでは、単一ファイルのアップロードからの唯一の変更は、リクエストの本文を作成することです。

複数のファイルを作成し、MultiValueMapに同じキー追加してみましょう。

明らかに、リクエストURLは複数のファイルをアップロードするためのエンドポイントを参照する必要があります。

MultiValueMap<String, Object> body
  = new LinkedMultiValueMap<>();
body.add("files", getTestFile());
body.add("files", getTestFile());
body.add("files", getTestFile());
    
HttpEntity<MultiValueMap<String, Object>> requestEntity
  = new HttpEntity<>(body, headers);

String serverUrl = "http://localhost:8082/spring-rest/fileserver/multiplefileupload/";

RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate
  .postForEntity(serverUrl, requestEntity, String.class);

複数ファイルのアップロードを使用して、単一ファイルのアップロードをモデル化することはいつでも可能です。

7. 結論

結論として、Spring RestTemplateを使用したMultipartFile転送のケースを確認しました。

いつものように、サンプルのクライアントとサーバーのソースコードは、GitHubから入手できます。