Browse Source

Polish

pull/1418/head
Rossen Stoyanchev 8 years ago
parent
commit
a56f735edd
  1. 38
      spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java

38
spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriter.java

@ -26,7 +26,7 @@ import java.util.Map; @@ -26,7 +26,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import javax.mail.internet.MimeUtility;
import org.reactivestreams.Publisher;
@ -71,28 +71,18 @@ public class MultipartHttpMessageWriter implements HttpMessageWriter<MultiValueM @@ -71,28 +71,18 @@ public class MultipartHttpMessageWriter implements HttpMessageWriter<MultiValueM
private Charset filenameCharset = DEFAULT_CHARSET;
private final DataBufferFactory bufferFactory;
private final DataBufferFactory bufferFactory = new DefaultDataBufferFactory();
public MultipartHttpMessageWriter() {
this(new DefaultDataBufferFactory());
}
public MultipartHttpMessageWriter(DataBufferFactory bufferFactory) {
this.partWriters = Arrays.asList(
new EncoderHttpMessageWriter<>(CharSequenceEncoder.textPlainOnly()),
new ResourceHttpMessageWriter()
);
this.bufferFactory = bufferFactory;
}
public MultipartHttpMessageWriter(List<HttpMessageWriter<?>> partWriters) {
this(partWriters, new DefaultDataBufferFactory());
}
public MultipartHttpMessageWriter(List<HttpMessageWriter<?>> partWriters, DataBufferFactory factory) {
this.partWriters = partWriters;
this.bufferFactory = factory;
}
/**
@ -130,12 +120,17 @@ public class MultipartHttpMessageWriter implements HttpMessageWriter<MultiValueM @@ -130,12 +120,17 @@ public class MultipartHttpMessageWriter implements HttpMessageWriter<MultiValueM
byte[] boundary = generateMultipartBoundary();
HttpHeaders headers = outputMessage.getHeaders();
headers.setContentType(new MediaType(MediaType.MULTIPART_FORM_DATA,
outputMessage.getHeaders().setContentType(new MediaType("multipart", "form-data",
Collections.singletonMap("boundary", new String(boundary, StandardCharsets.US_ASCII))));
return Mono.from(inputStream).flatMap(multiValueMap ->
outputMessage.writeWith(generateParts(multiValueMap, boundary)));
return Mono.from(inputStream).flatMap(map -> {
Flux<DataBuffer> body = Flux.fromIterable(map.entrySet())
.concatMap(entry -> encodePartValues(boundary, entry.getKey(), entry.getValue()))
.concatWith(Mono.just(generateLastLine(boundary)));
return outputMessage.writeWith(body);
});
}
/**
@ -146,16 +141,13 @@ public class MultipartHttpMessageWriter implements HttpMessageWriter<MultiValueM @@ -146,16 +141,13 @@ public class MultipartHttpMessageWriter implements HttpMessageWriter<MultiValueM
return MimeTypeUtils.generateMultipartBoundary();
}
private Flux<DataBuffer> generateParts(MultiValueMap<String, ?> map, byte[] boundary) {
return Flux.fromIterable(map.entrySet())
.concatMap(entry -> Flux
.fromIterable(entry.getValue())
.concatMap(value -> generatePart(entry.getKey(), value, boundary)))
.concatWith(Mono.just(generateLastLine(boundary)));
private Flux<DataBuffer> encodePartValues(byte[] boundary, String name, List<?> values) {
return Flux.concat(values.stream().map(v ->
encodePart(boundary, name, v)).collect(Collectors.toList()));
}
@SuppressWarnings("unchecked")
private <T> Flux<DataBuffer> generatePart(String name, T value, byte[] boundary) {
private <T> Flux<DataBuffer> encodePart(byte[] boundary, String name, T value) {
MultipartHttpOutputMessage outputMessage = new MultipartHttpOutputMessage(this.bufferFactory);

Loading…
Cancel
Save