@Override public MultipartInserter with(String key, Object value) { this.builder.part(key, value); return this; }
/** * Add a part from an Object. * @param name the name of the part to add * @param part the part data * @return builder that allows for further customization of part headers */ public PartBuilder part(String name, Object part) { return part(name, part, null); }
/** * Add a part from an Object. * @param name the name of the part to add * @param part the part data * @return builder that allows for further customization of part headers */ public PartBuilder part(String name, Object part) { return part(name, part, null); }
@SuppressWarnings("unchecked") private MultipartInserter withInternal(MultiValueMap<String, ?> values) { values.forEach((key, valueList) -> { for (Object value : valueList) { this.builder.part(key, value); } }); return this; }
private MultiValueMap<String, HttpEntity<?>> generateBody() { MultipartBodyBuilder builder = new MultipartBodyBuilder(); builder.part("fieldPart", "fieldValue"); builder.part("fileParts", new ClassPathResource("foo.txt", MultipartHttpMessageReader.class)); builder.part("fileParts", new ClassPathResource("logo.png", getClass())); builder.part("jsonPart", new Person("Jason")); return builder.build(); }
private MultiValueMap<String, HttpEntity<?>> getMultipartBody() { MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder(); multiParts.stream().forEach(multipart -> multipartBodyBuilder.part(multipart.getFileName(), multipart.getContentBody())); return multipartBodyBuilder.build(); }
private ServerHttpRequest generateMultipartRequest() { MultipartBodyBuilder partsBuilder = new MultipartBodyBuilder(); partsBuilder.part("fooPart", new ClassPathResource("org/springframework/http/codec/multipart/foo.txt")); partsBuilder.part("barPart", "bar"); MockClientHttpRequest outputMessage = new MockClientHttpRequest(HttpMethod.POST, "/"); new MultipartHttpMessageWriter() .write(Mono.just(partsBuilder.build()), null, MediaType.MULTIPART_FORM_DATA, outputMessage, null) .block(Duration.ofSeconds(5)); return MockServerHttpRequest.post("/") .contentType(outputMessage.getHeaders().getContentType()) .body(outputMessage.getBody()); }
@Test public void fluxPerson() { MethodParameter param = this.testMethod.annot(requestPart()).arg(Flux.class, Person.class); MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("name", new Person("Jones")); bodyBuilder.part("name", new Person("James")); Flux<Person> actual = resolveArgument(param, bodyBuilder); List<Person> persons = actual.collectList().block(); assertEquals("Jones", persons.get(0).getName()); assertEquals("James", persons.get(1).getName()); }
@Test public void listPart() { MethodParameter param = this.testMethod.annot(requestPart()).arg(List.class, Part.class); MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("name", new Person("Jones")); bodyBuilder.part("name", new Person("James")); List<Part> actual = resolveArgument(param, bodyBuilder); assertEquals("{\"name\":\"Jones\"}", partToUtf8String(actual.get(0))); assertEquals("{\"name\":\"James\"}", partToUtf8String(actual.get(1))); }
@Test public void fluxPart() { MethodParameter param = this.testMethod.annot(requestPart()).arg(Flux.class, Part.class); MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("name", new Person("Jones")); bodyBuilder.part("name", new Person("James")); Flux<Part> actual = resolveArgument(param, bodyBuilder); List<Part> parts = actual.collectList().block(); assertEquals("{\"name\":\"Jones\"}", partToUtf8String(parts.get(0))); assertEquals("{\"name\":\"James\"}", partToUtf8String(parts.get(1))); }
@Test public void listPerson() { MethodParameter param = this.testMethod.annot(requestPart()).arg(List.class, Person.class); MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("name", new Person("Jones")); bodyBuilder.part("name", new Person("James")); List<Person> actual = resolveArgument(param, bodyBuilder); assertEquals("Jones", actual.get(0).getName()); assertEquals("James", actual.get(1).getName()); }
@Test public void monoPart() { MethodParameter param = this.testMethod.annot(requestPart()).arg(Mono.class, Part.class); MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("name", new Person("Jones")); Mono<Part> actual = resolveArgument(param, bodyBuilder); Part part = actual.block(); assertEquals("{\"name\":\"Jones\"}", partToUtf8String(part)); }
@Test public void monoPerson() { MethodParameter param = this.testMethod.annot(requestPart()).arg(Mono.class, Person.class); MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("name", new Person("Jones")); Mono<Person> actual = resolveArgument(param, bodyBuilder); assertEquals("Jones", actual.block().getName()); }
@Test public void part() { MethodParameter param = this.testMethod.annot(requestPart()).arg(Part.class); MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("name", new Person("Jones")); Part actual = resolveArgument(param, bodyBuilder); DataBuffer buffer = DataBufferUtils.join(actual.content()).block(); assertEquals("{\"name\":\"Jones\"}", DataBufferTestUtils.dumpString(buffer, StandardCharsets.UTF_8)); }
@Test // SPR-16601 public void publisherEntityAcceptedAsInput() { Publisher<String> publisher = Flux.just("foo", "bar", "baz"); MultipartBodyBuilder builder = new MultipartBodyBuilder(); builder.asyncPart("publisherClass", publisher, String.class).header("baz", "qux"); HttpEntity<?> entity = builder.build().getFirst("publisherClass"); assertNotNull(entity); assertEquals(PublisherEntity.class, entity.getClass()); // Now build a new MultipartBodyBuilder, as BodyInserters.fromMultipartData would do... builder = new MultipartBodyBuilder(); builder.part("publisherClass", entity); entity = builder.build().getFirst("publisherClass"); assertNotNull(entity); assertEquals(PublisherEntity.class, entity.getClass()); }
@Test public void person() { MethodParameter param = this.testMethod.annot(requestPart()).arg(Person.class); MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("name", new Person("Jones")); Person actual = resolveArgument(param, bodyBuilder); assertEquals("Jones", actual.getName()); }
@Test // SPR-16376 public void customContentDisposition() throws IOException { Resource logo = new ClassPathResource("/org/springframework/http/converter/logo.jpg"); Flux<DataBuffer> buffers = DataBufferUtils.read(logo, new DefaultDataBufferFactory(), 1024); long contentLength = logo.contentLength(); MultipartBodyBuilder bodyBuilder = new MultipartBodyBuilder(); bodyBuilder.part("resource", logo) .headers(h -> h.setContentDispositionFormData("resource", "spring.jpg")); bodyBuilder.asyncPart("buffers", buffers, DataBuffer.class) .headers(h -> { h.setContentDispositionFormData("buffers", "buffers.jpg"); h.setContentType(MediaType.IMAGE_JPEG); h.setContentLength(contentLength); }); MultiValueMap<String, HttpEntity<?>> multipartData = bodyBuilder.build(); Map<String, Object> hints = Collections.emptyMap(); this.writer.write(Mono.just(multipartData), null, MediaType.MULTIPART_FORM_DATA, this.response, hints).block(); MultiValueMap<String, Part> requestParts = parse(hints); assertEquals(2, requestParts.size()); Part part = requestParts.getFirst("resource"); assertTrue(part instanceof FilePart); assertEquals("spring.jpg", ((FilePart) part).filename()); assertEquals(logo.getFile().length(), part.headers().getContentLength()); part = requestParts.getFirst("buffers"); assertTrue(part instanceof FilePart); assertEquals("buffers.jpg", ((FilePart) part).filename()); assertEquals(logo.getFile().length(), part.headers().getContentLength()); }
bodyBuilder.part("name 1", "value 1"); bodyBuilder.part("name 2", "value 2+1"); bodyBuilder.part("name 2", "value 2+2"); bodyBuilder.part("logo", logo); bodyBuilder.part("utf8", utf8); bodyBuilder.part("json", new Foo("bar"), MediaType.APPLICATION_JSON_UTF8); bodyBuilder.asyncPart("publisher", publisher, String.class); Mono<MultiValueMap<String, HttpEntity<?>>> result = Mono.just(bodyBuilder.build());