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で利用可能]です。