Thank you Alexander. I have implemented the call to post. I see that debugging on the server side, the following exception is thrown twice. Once on read, once on close. (You can see the stack trace details)
nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly"
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:983)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.read(MultipartStream.java:887)
at java.io.InputStream.read(InputStream.java:101)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:94)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:156)
at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:139)
at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1047)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:892)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.makeAvailable(MultipartStream.java:983)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.close(MultipartStream.java:924)
at org.apache.commons.fileupload.MultipartStream$ItemInputStream.close(MultipartStream.java:904)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:119)
at org.apache.commons.fileupload.util.Streams.copy(Streams.java:64)
at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:362)
at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)
at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:156)
at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:139)
at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1047)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:892)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
There is also a comment in that bit of code just before the exception is thrown which says:
// The last pad amount is left in the buffer.
// Boundary can't be in there so signal an error
// condition.
And below is my vertx request code. I think this is right, do you see any obvious issues?
package com.test.upload;
import org.vertx.java.core.Handler;
import org.vertx.java.core.http.HttpClient;
import org.vertx.java.core.http.HttpClientRequest;
import org.vertx.java.core.http.HttpClientResponse;
import org.vertx.java.platform.Verticle;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class UploadVerticle extends Verticle {
public void start() {
super.start();
HttpClient client = vertx.createHttpClient().setPort(8080).setHost("localhost");
final HttpClientRequest req = client.post("/api/images/post", new Handler<HttpClientResponse>() { public void handle(HttpClientResponse response) {
System.out.println("File upload attempted " + response.statusCode());
}
}).setChunked(false).setTimeout(60000);
String filename = "/Users/me/Documents/blob.jpg";
String fileSize = null;
try {
fileSize = String.valueOf(Files.size(Paths.get(filename)));
} catch(IOException e) {
e.printStackTrace();
}
// For a non-chunked upload you need to specify size of upload up-front
try {
String imageString = new String(Files.readAllBytes(Paths.get("/Users/me/Documents/blob.jpg")));
System.out.println(fileSize);
req.putHeader("Content-Type", "multipart/form-data; boundary=MyBoundary");
req.putHeader("accept", "application/json");
req.putHeader("Content-Length", fileSize);
req.write("--MyBoundary\r\n" +
"Content-Disposition: form-data; name=\"photo\"; filename=\"blob.jpg\"\r\n" +
"Content-Type: image/jpeg\r\n" +
"Content-Transfer-Encoding: binary\r\n\r\n" +
imageString + "\r\n" +
"--MyBoundary--").end();
} catch (Exception e) {
e.printStackTrace();
}
}