インターフェース 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()これが特定のパーツの最後のイベントかどうかを示します。