SpringRestTemplateを使用したMultipartFileのアップロード
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. 単一ファイルのアップロード
まず、見てみましょう
ヘッダーと本文を使用して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でから入手できます。