Apache HttpComponents HttpClient MIME multipart entity support for handling multipart/form-data requests and file uploads
npx @tessl/cli install tessl/maven-org-apache-httpcomponents--httpmime@4.5.0Apache HttpComponents HttpMime provides comprehensive support for MIME multipart encoded entities and form-based file uploads for the Apache HttpClient library. It enables developers to handle multipart/form-data requests, file uploads, and complex form submissions in HTTP client applications with efficient memory management and streaming capabilities.
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.14</version>
</dependency>import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.FormBodyPartBuilder;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.content.StringBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.entity.mime.content.ByteArrayBody;
import org.apache.http.entity.mime.content.InputStreamBody;
import org.apache.http.HttpEntity;import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.HttpEntity;
import org.apache.http.entity.ContentType;
import java.io.File;
// Simple form with text fields
HttpEntity entity = MultipartEntityBuilder.create()
.addTextBody("username", "john_doe")
.addTextBody("description", "User profile update")
.build();
// File upload with form data
HttpEntity fileUploadEntity = MultipartEntityBuilder.create()
.addBinaryBody("file", new File("document.pdf"),
ContentType.APPLICATION_PDF, "document.pdf")
.addTextBody("title", "Important Document")
.addTextBody("category", "reports")
.build();
// Mixed content with different body types
byte[] imageData = // ... image bytes
HttpEntity mixedEntity = MultipartEntityBuilder.create()
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
.addTextBody("description", "Profile image")
.addBinaryBody("avatar", imageData, ContentType.IMAGE_JPEG, "avatar.jpg")
.addBinaryBody("document", new File("resume.pdf"))
.build();HttpMime is built around several key components:
Core functionality for creating multipart HTTP entities using a fluent builder pattern. Essential for file uploads and complex form submissions.
public class MultipartEntityBuilder {
public static MultipartEntityBuilder create();
public MultipartEntityBuilder setMode(HttpMultipartMode mode);
public MultipartEntityBuilder addTextBody(String name, String text);
public MultipartEntityBuilder addBinaryBody(String name, File file);
public HttpEntity build();
}Different content body implementations for handling various data types in multipart forms, from simple text to binary files and streams.
public interface ContentBody extends ContentDescriptor {
String getFilename();
void writeTo(OutputStream out) throws IOException;
}
public class StringBody extends AbstractContentBody {
public StringBody(String text, ContentType contentType);
}
public class FileBody extends AbstractContentBody {
public FileBody(File file, ContentType contentType, String filename);
}Advanced form part creation with custom headers and fine-grained control over multipart section properties.
public class FormBodyPartBuilder {
public static FormBodyPartBuilder create(String name, ContentBody body);
public FormBodyPartBuilder addField(String name, String value);
public FormBodyPart build();
}
public class FormBodyPart {
public String getName();
public ContentBody getBody();
public Header getHeader();
}public enum HttpMultipartMode {
/** RFC 822, RFC 2045, RFC 2046 compliant */
STRICT,
/** Browser-compatible mode, only write Content-Disposition; use content charset */
BROWSER_COMPATIBLE,
/** RFC 6532 compliant */
RFC6532
}
public interface ContentDescriptor {
String getMimeType();
String getMediaType();
String getSubType();
String getCharset();
String getTransferEncoding();
long getContentLength();
}
public class Header {
public void addField(MinimalField field);
public MinimalField getField(String name);
public List<MinimalField> getFields();
public List<MinimalField> getFields(String name);
public int removeFields(String name);
public void setField(MinimalField field);
public Iterator<MinimalField> iterator();
}
public class MinimalField {
public MinimalField(String name, String value);
public String getName();
public String getBody();
}