Skip to content

Commit 283811b

Browse files
committed
Ensure filename is written
Now that SPR-16307 makes it possible to write a part with a Publisher we need to ensure we get the filename correctly when writing with Publisher<Resource>. Issue: SPR-16376
1 parent aea6bb6 commit 283811b

File tree

2 files changed

+13
-5
lines changed

2 files changed

+13
-5
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,17 @@ private <T> Flux<DataBuffer> encodePart(byte[] boundary, String name, T value) {
252252
resolvableType = ResolvableType.forClass(body.getClass());
253253
}
254254

255-
String filename = (body instanceof Resource ? ((Resource) body).getFilename() : null);
256-
outputMessage.getHeaders().setContentDispositionFormData(name, filename);
255+
if (body instanceof Resource) {
256+
outputMessage.getHeaders().setContentDispositionFormData(name, ((Resource) body).getFilename());
257+
}
258+
else if (Resource.class.equals(resolvableType.getRawClass())) {
259+
body = (T) Mono.from((Publisher<?>) body).doOnNext(o -> {
260+
outputMessage.getHeaders().setContentDispositionFormData(name, ((Resource) o).getFilename());
261+
});
262+
}
263+
else {
264+
outputMessage.getHeaders().setContentDispositionFormData(name, null);
265+
}
257266

258267
MediaType contentType = outputMessage.getHeaders().getContentType();
259268

spring-web/src/test/java/org/springframework/http/codec/multipart/MultipartHttpMessageWriterTests.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,8 @@ public void singleSubscriberWithResource() throws IOException {
170170

171171
Part part = requestParts.getFirst("logo");
172172
assertEquals("logo", part.name());
173-
// TODO: a Resource written as an async part doesn't have a file name in the contentDisposition
174-
// assertTrue(part instanceof FilePart);
175-
// assertEquals("logo.jpg", ((FilePart) part).filename());
173+
assertTrue(part instanceof FilePart);
174+
assertEquals("logo.jpg", ((FilePart) part).filename());
176175
assertEquals(MediaType.IMAGE_JPEG, part.headers().getContentType());
177176
assertEquals(logo.getFile().length(), part.headers().getContentLength());
178177
}

0 commit comments

Comments
 (0)