インターフェース PartEvent
- すべての既知のサブインターフェース:
FilePartEvent
,FormPartEvent
public interface PartEvent
"multipart/form-data" リクエストのイベントを表します。
FormPartEvent
または FilePartEvent
にすることができます。サーバー側
マルチパート HTTP メッセージの各パートは、headers
とパートの内容を含むバッファの両方を含む PartEvent
を少なくとも 1 つ生成します。- フォームフィールドは、フィールドの値を含む単一の
FormPartEvent
を生成します。 - ファイルのアップロードでは、アップロード時に使用されるファイル名を含む 1 つ以上の
FilePartEvent
が生成されます。ファイルが複数のバッファに分割できるほど大きい場合、最初のFilePartEvent
の後に後続のイベントが続きます。
PartEvent
では、isLast()
が true
に設定され、その後に後続のパーツに属する追加のイベントが続きます。isLast()
プロパティは、Flux.windowUntil(Predicate)
演算子の述語として適しています。イベントをすべてのパーツから、それぞれが 1 つのパーツに属するウィンドウに分割するためです。そこから、Flux.switchOnFirst(BiFunction)
オペレーターを使用すると、フォームフィールドまたはファイルのアップロードを処理しているかどうかを確認できます。例:Flux<PartEvent> allPartsEvents = ... // obtained via @RequestPayload or request.bodyToFlux(PartEvent.class) allPartsEvents.windowUntil(PartEvent::isLast) .concatMap(p -> p.switchOnFirst((signal, partEvents) -> { if (signal.hasValue()) { PartEvent event = signal.get(); if (event instanceof FormPartEvent formEvent) { String value = formEvent.value(); // handle form field } else if (event instanceof FilePartEvent fileEvent) { String filename = fileEvent.filename(); Flux<DataBuffer> contents = partEvents.map(PartEvent::content); // handle file upload } else { return Mono.error(new RuntimeException("Unexpected event: " + event)); } } else { return partEvents; // either complete or error signal } }))受信したパーツイベントは、
WebClient
を使用して別のサービスに中継することもできます。下記参照。メモリリークを避けるために、本文の内容を完全に消費、中継、解放する必要があることに注意してください。
クライアント側
クライアント側では、ファイルのアップロードを表すPartEvent
を作成できます。- フォームフィールドは
FormPartEvent.create(String, String)
で作成できます。 - ファイルのアップロードは
FilePartEvent.create(String, Path)
経由で作成できます。
Flux.concat(Publisher[])
を介して連結して、WebClient
のリクエストを作成できます。たとえば、このサンプルは、フォームフィールドとファイルを含むマルチパートフォームを POST します。Resource resource = ... Mono<String> result = webClient .post() .uri("https://example.com") .body(Flux.concat( FormPartEvent.create("field", "field value"), FilePartEvent.create("file", resource) ), PartEvent.class) .retrieve() .bodyToMono(String.class);
- 導入:
- 6.0
- 作成者:
- Arjen Poutsma
- 関連事項:
メソッドの詳細
name
Content-Disposition name
パラメーターで指定されたイベントの名前を返します。- 戻り値:
- パーツの名前。
null
または空ではありません
headers
HttpHeaders headers()このイベントが属するパーツのヘッダーを返します。content
DataBuffer content()このイベントの内容を返します。返されたバッファは、消費または解放する必要があります。isLast
boolean isLast()これが特定のパーツの最後のイベントかどうかを示します。