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

1概要

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

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

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

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

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

もう1つの一般的なユースケースは、添付ファイル付きの電子メールの送信です。

マルチパートファイルリクエストは、大きなファイルを小さな塊に分割し、境界マーカーを使ってブロックの開始と終了を示します。

マルチパートリクエストの詳細については、https://www.w3.org/Protocols/rfc1341/7 2 Multipart.html[こちら]を参照してください。

3 Mavenの依存関係

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

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

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

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

  • POST/fileserver/singlefileupload/

  • POST/fileserver/multiplefileupload/

5. 1つのファイルをアップロードする

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

__HttpEntity withヘッダーと本文を作成する必要があります。 content-type ヘッダー値を MediaType.MULTIPART FORM DATA に設定します。このヘッダが設定されると、 RestTemplate__は自動的にファイルデータをメタデータと一緒に整列化します。

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

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

次に、リクエストボディをhttps://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/LinkedMultiValueMap.html[ LinkedMultiValueMap ]クラスのインスタンスとして構築します。 LinkedMultiValueMap は、 LinkedList に各キーの複数の値を格納する LinkedHashMap をラップします。

この例では、 getTestFile() メソッドがその場でダミーファイルを生成し、https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/io/を返しますFileSystemResource.html[ FileSystemResource ]:

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

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

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

最後に、https://www.baeldung.com/rest-template[ 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 転送のケースを見ました。

いつものように、サンプルのクライアントとサーバーのソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-rest[GitHubで利用可能]です。