Spring RestTemplateを使用したMultipartFileのアップロード

Spring RestTemplateを使用したMultipartFileのアップロード

1. 概要

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

両方のa single file and multiple files – uploadusing the RestTemplate.が表示されます

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

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

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

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

マルチパートリクエストhereの詳細をご覧ください。

3. メーベン依存

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


    org.springframework
    spring-web
    5.0.7.RELEASE

4. File Upload Server

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

  • POST / fileserver / singlefileupload /

  • POST / fileserver / multiplefileupload /

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

まず、single file upload using the RestTemplate.を見てみましょう

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

メタデータには、ファイル名、ファイルサイズ、およびファイルコンテンツタイプ(たとえば、text/plain)が含まれます。

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

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

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

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

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

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

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

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

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

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

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

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

MultiValueMapに複数のファイルとadd them with the same keyを作成しましょう。

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

MultiValueMap body
  = new LinkedMultiValueMap<>();
body.add("files", getTestFile());
body.add("files", getTestFile());
body.add("files", getTestFile());

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

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

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

model single file upload using the multiple file upload.はいつでも可能です

7. 結論

結論として、SpringRestTemplateを使用したMultipartFile転送のケースが見られました。

いつものように、サンプルのクライアントとサーバーのソースコードはover on GitHubで利用できます。