To upload a file using the modern HttpClient
introduced in Java 11, you can use the multipart/form-data
request. The steps involve creating a HttpRequest
and sending the file as part of the multipart request body. Below is an example implementation:
Example Code: File Upload with Multipart
package org.kodejava.net.http;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.UUID;
public class FileUploadDemo {
public static void main(String[] args) throws Exception {
// File to be uploaded
Path filePath = Paths.get("path/to/your/file.txt");
// Create boundary for multipart request
String boundary = UUID.randomUUID().toString();
// Build the multipart body
String body =
"--" + boundary + "\r\n" +
"Content-Disposition: form-data; name=\"file\"; filename=\"" + filePath.getFileName() + "\"\r\n" +
"Content-Type: text/plain\r\n\r\n" +
java.nio.file.Files.readString(filePath) + "\r\n" +
"--" + boundary + "--\r\n";
// Create HttpClient
HttpClient client = HttpClient.newHttpClient();
// Build HttpRequest
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://your-api-endpoint.com/upload"))
.header("Content-Type", "multipart/form-data; boundary=" + boundary)
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
// Send the request and handle response
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
// Print response
System.out.println("Response Code: " + response.statusCode());
System.out.println("Response Body: " + response.body());
}
}
Explanation:
- Boundary:
- A boundary string (
UUID
) is specified to separate parts in themultipart/form-data
content. It’s used in headers and to indicate where each part starts and ends.
- A boundary string (
- Request Body:
- Each part in the multipart body includes:
Content-Disposition
: Specifies form-data, name, and file name.Content-Type
: MIME type of the file (e.g.,text/plain
for text files).- File content is appended after the headers.
- Each part in the multipart body includes:
- Headers:
- Set the
Content-Type
header tomultipart/form-data
with the boundary value.
- Set the
- HttpClient:
HttpClient
sends the HTTPPOST
request, andBodyPublishers.ofString()
sets the request body.
Notes:
- Replace
"path/to/your/file.txt"
with the actual path of the file to upload. - Update
"https://your-api-endpoint.com/upload"
with the appropriate API endpoint for uploading files. - Adjust the
Content-Type
for the file if it’s not a plain text file (e.g.,"image/png"
,"application/json"
).
Considerations for Larger Files:
The above example uses files.readString()
to read the file content into memory. For large files, this approach may corrupt memory. Instead, you can use BodyPublishers.ofFile()
to stream the file content directly:
HttpRequest.BodyPublisher body = HttpRequest.BodyPublishers.ofFile(filePath);
// Use this body publisher in your POST request
This is more memory-efficient and suitable for uploading large files.