Apache HttpComponents HttpClient MIME multipart entity support for handling multipart/form-data requests and file uploads
—
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Apache 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();
}