Apache HttpClient making multipart form post
Use MultipartEntityBuilder from the HttpMime library to perform the request you want.
In my project I do that this way:
HttpEntity entity = MultipartEntityBuilder
.create()
.addTextBody("number", "5555555555")
.addTextBody("clip", "rickroll")
.addBinaryBody("upload_file", new File(filePath), ContentType.APPLICATION_OCTET_STREAM, "filename")
.addTextBody("tos", "agree")
.build();
HttpPost httpPost = new HttpPost("http://some-web-site");
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);
HttpEntity result = response.getEntity();
Hope this will help.
(Updated this post to use MultipartEntityBuilder instead of deprecated MultipartEntity, using @mtomy code as the example)
Apache Http Client 4 Form Post Multi-part data
I accepted gustf's answer because it got rid of the exception I was having and so I thought I was on the right track, but it was not complete. The below is what I did to finally get it to work...
File payload = new File("/Users/CasinoRoyaleBank")
MultipartEntity entity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE );
entity.addPart( "file", new FileBody(payload))
entity.addPart( "username", new StringBody("bond"))
entity.addPart( "password", new StringBody("vesper"))
httpPost.setEntity( entity );
CloseableHttpResponse response = httpclient.execute(httpPost);
Apache HttpClient. How to properly produce multipart requests with Encoding
Found the point, on which it was failing. Needed this addition:
.addTextBody("TYPE", "6",ContentType.WILDCARD)
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE).setCharset(Charset.forName("UTF-8"))
How can I make a multipart/form-data POST request using Java?
We use HttpClient 4.x to make multipart file post.
UPDATE: As of HttpClient 4.3, some classes have been deprecated. Here is the code with new API:
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost uploadFile = new HttpPost("...");
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addTextBody("field1", "yes", ContentType.TEXT_PLAIN);
// This attaches the file to the POST:
File f = new File("[/path/to/upload]");
builder.addBinaryBody(
"file",
new FileInputStream(f),
ContentType.APPLICATION_OCTET_STREAM,
f.getName()
);
HttpEntity multipart = builder.build();
uploadFile.setEntity(multipart);
CloseableHttpResponse response = httpClient.execute(uploadFile);
HttpEntity responseEntity = response.getEntity();
Below is the original snippet of code with deprecated HttpClient 4.0 API:
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
FileBody bin = new FileBody(new File(fileName));
StringBody comment = new StringBody("Filename: " + fileName);
MultipartEntity reqEntity = new MultipartEntity();
reqEntity.addPart("bin", bin);
reqEntity.addPart("comment", comment);
httppost.setEntity(reqEntity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity resEntity = response.getEntity();
Multipart Post request in Apache Httpclient 4.5.6 not working
HttpUriRequest request = RequestBuilder.post("https://transport-stg.transperfect.com/api/files/upload")
.addHeader("Content-Type","multipart/form-data")
The Content-Type
value in your code is invalid as it does not include the boundary
parameter.
You should not meddle with Content-Type
header at the request level and let HttpClient generate it automatically based on properties of the enclosed request entity.
How to create a repeatable POST request that contains multipart-form-data?
I had to modify all the classes that inherited from HttpContent
so that they would report back correctly with .retrySupported()
so that the when the ApacheHttpTransport
code was entered it would create repeatable content correctly.
The changes were made against version 1.20.0
because that is what I was using. I am submitting a pull request against dev
branch HEAD
so hopefully, this or some version of this will make it into the next release.
Here are the modifications that need to be merged in.
Related Topics
How to Set an Environment Variable at Runtime from Java
Java: Set Timeout on a Certain Block of Code
Why Doesn't Java.Util.Collection Implement the New Stream Interface
Favor Composition Over Inheritance
Java: Why am I Required to Initialize a Primitive Local Variable
Why Does Hibernate Disable Insert Batching When Using an Identity Identifier Generator
Pdfbox Encode Symbol Currency Euro
Why Does My Aes Encryption Throws an Invalidkeyexception
What Is an Instance Variable in Java
How to Change the Name of a Java Application Process
Override "Private" Method in Java
Java:Read Last N Lines of a Huge File
Adding New Paths for Native Libraries at Runtime in Java
Java: Local Variable Mi Defined in an Enclosing Scope Must Be Final or Effectively Final