From e51f7abf5d287f287f59a47c880cf195fd2544de Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Thu, 5 Dec 2019 09:42:34 -0500 Subject: [PATCH 1/2] BAEL-3559: Added purpose-built endpoint for testing multipart uploads with HttpClient. --- .../HttpClientMultipartLiveTest.java | 10 +++--- .../MultipartFileUploadStubController.java | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java diff --git a/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java b/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java index 9912e73c2b..1752c27286 100644 --- a/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java +++ b/httpclient/src/test/java/org/baeldung/httpclient/HttpClientMultipartLiveTest.java @@ -34,7 +34,7 @@ public class HttpClientMultipartLiveTest { // No longer available // private static final String SERVER = "http://echo.200please.com"; - private static final String SERVER = "http://posttestserver.com/post.php"; + private static final String SERVER = "http://localhost:8080/spring-mvc-java/stub/multipart"; private static final String TEXTFILENAME = "temp.txt"; private static final String IMAGEFILENAME = "image.jpg"; private static final String ZIPFILENAME = "zipFile.zip"; @@ -84,7 +84,7 @@ public class HttpClientMultipartLiveTest { // final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); - builder.addPart("upfile", fileBody); + builder.addPart("file", fileBody); builder.addPart("text1", stringBody1); builder.addPart("text2", stringBody2); final HttpEntity entity = builder.build(); @@ -112,7 +112,7 @@ public class HttpClientMultipartLiveTest { final String message = "This is a multipart post"; final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); - builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, TEXTFILENAME); + builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, TEXTFILENAME); builder.addTextBody("text", message, ContentType.DEFAULT_BINARY); final HttpEntity entity = builder.build(); post.setEntity(entity); @@ -141,7 +141,7 @@ public class HttpClientMultipartLiveTest { final String message = "This is a multipart post"; final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); - builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, IMAGEFILENAME); + builder.addBinaryBody("file", file, ContentType.DEFAULT_BINARY, IMAGEFILENAME); builder.addBinaryBody("upstream", inputStream, ContentType.create("application/zip"), ZIPFILENAME); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); final HttpEntity entity = builder.build(); @@ -165,7 +165,7 @@ public class HttpClientMultipartLiveTest { final byte[] bytes = "binary code".getBytes(); final MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); - builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, TEXTFILENAME); + builder.addBinaryBody("file", bytes, ContentType.DEFAULT_BINARY, TEXTFILENAME); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); final HttpEntity entity = builder.build(); post.setEntity(entity); diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java new file mode 100644 index 0000000000..cac1ece5df --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java @@ -0,0 +1,33 @@ +package com.baeldung.web.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.multipart.MultipartFile; + +@Controller +public class MultipartFileUploadStubController { + + private static final Logger logger = LoggerFactory.getLogger(MultipartFileUploadStubController.class); + + @PostMapping("/stub/multipart") + @ResponseStatus(HttpStatus.OK) + public void uploadFile(MultipartFile file, String text, String text1, String text2, MultipartFile upstream) { + logger.info("Uploaded file: " + format(file)); + logger.info(" - text: [" + format(text) + "]"); + logger.info(" - text1: [" + format(text1) + "]"); + logger.info(" - text2: [" + format(text2) + "]"); + logger.info(" - upstream: [" + format(upstream) + "]"); + } + + private static String format(MultipartFile file) { + return file == null ? "" : file.getOriginalFilename() + " (size: " + file.getSize() + " bytes)"; + } + + private static String format(String str) { + return str == null ? "" : str; + } +} From 26f4ea1cd106d2335e176ee65bc1c72c4acd3521 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Sat, 7 Dec 2019 09:08:35 -0500 Subject: [PATCH 2/2] BAEL-3559: Change server response to mimic an echo server --- .../MultipartFileUploadStubController.java | 61 +++++++++++++------ 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java b/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java index cac1ece5df..28c35e8603 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java +++ b/spring-mvc-java/src/main/java/com/baeldung/web/controller/MultipartFileUploadStubController.java @@ -1,33 +1,58 @@ package com.baeldung.web.controller; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.multipart.MultipartFile; @Controller public class MultipartFileUploadStubController { - - private static final Logger logger = LoggerFactory.getLogger(MultipartFileUploadStubController.class); @PostMapping("/stub/multipart") - @ResponseStatus(HttpStatus.OK) - public void uploadFile(MultipartFile file, String text, String text1, String text2, MultipartFile upstream) { - logger.info("Uploaded file: " + format(file)); - logger.info(" - text: [" + format(text) + "]"); - logger.info(" - text1: [" + format(text1) + "]"); - logger.info(" - text2: [" + format(text2) + "]"); - logger.info(" - upstream: [" + format(upstream) + "]"); + public ResponseEntity uploadFile(MultipartFile file, String text, String text1, String text2, MultipartFile upstream) { + UploadResultResource result = new UploadResultResource(file, text, text1, text2, upstream); + return new ResponseEntity<>(result, HttpStatus.OK); } - private static String format(MultipartFile file) { - return file == null ? "" : file.getOriginalFilename() + " (size: " + file.getSize() + " bytes)"; - } - - private static String format(String str) { - return str == null ? "" : str; + public static class UploadResultResource { + + private final String file; + private final String text; + private final String text1; + private final String text2; + private final String upstream; + + public UploadResultResource(MultipartFile file, String text, String text1, String text2, MultipartFile upstream) { + this.file = format(file); + this.text = text; + this.text1 = text1; + this.text2 = text2; + this.upstream = format(upstream); + } + + private static String format(MultipartFile file) { + return file == null ? null : file.getOriginalFilename() + " (size: " + file.getSize() + " bytes)"; + } + + public String getFile() { + return file; + } + + public String getText() { + return text; + } + + public String getText1() { + return text1; + } + + public String getText2() { + return text2; + } + + public String getUpstream() { + return upstream; + } } }