インターフェース PartEvent

すべての既知のサブインターフェース:
FilePartEventFormPartEvent

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 を作成できます。これらの静的メソッドによって返されるストリームは、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
関連事項:
  • メソッドのサマリー

    修飾子と型
    メソッド
    説明
    このイベントの内容を返します。
    このイベントが属するパーツのヘッダーを返します。
    boolean
    これが特定のパーツの最後のイベントかどうかを示します。
    default StringSE
    Content-Disposition name パラメーターで指定されたイベントの名前を返します。
  • メソッドの詳細

    • name

      default StringSE name()
      Content-Disposition name パラメーターで指定されたイベントの名前を返します。
      戻り値:
      パーツの名前。null または空ではありません
    • headers

      HttpHeaders headers()
      このイベントが属するパーツのヘッダーを返します。
    • content

      DataBuffer content()
      このイベントの内容を返します。返されたバッファは、消費または解放する必要があります。
    • isLast

      boolean isLast()
      これが特定のパーツの最後のイベントかどうかを示します。