static Multipart from(HttpRequest request) {
        requireNonNull(request, "request");
        final RequestHeaders headers = request.headers();
        @Nullable
        final MediaType mediaType = headers.contentType();
        checkState(mediaType != null, "Content-Type header is missing");
        final String boundary = Multiparts.getBoundary(mediaType);

        @SuppressWarnings("unchecked")
        final StreamMessage<HttpData> cast =
                (StreamMessage<HttpData>) (StreamMessage<?>) request.filter(HttpData.class::isInstance);
        return from(boundary, cast);
    }
Returns a decoded {@link Multipart} from the specified {@link HttpRequest}.
You can reactively subscribe to body parts using the {@link Publisher} of {@link #bodyParts()}:
<pre>{@code
import reactor.core.publisher.Flux;

HttpRequest req = ...;
Multipart multiPart = Multipart.from(req);

Flux.from(multiPart.bodyParts())
    .subscribe(bodyPart -> {
        Flux.from(bodyPart.content())
            .map(HttpData::toStringUtf8)
            .collectList()
            .subscribe(contents -> { ... });
    });
}</pre>
, or aggregate this {@link Multipart} using {@link #aggregate()}:
<pre>{@code
Multipart.from(req).aggregate()
         .thenAccept(multipart -> {
             for (AggregatedBodyPart bodyPart : multipart.bodyParts()) {
                 String content = bodyPart.contentUtf8();
                 ...
             }
         });
}</pre>

@see #bodyParts()
@see #aggregate()
core/src/main/java/com/linecorp/armeria/common/multipart/Multipart.java