How do I upload a file using multipart with Java 11 HttpClient?

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:

  1. Boundary:
    • A boundary string (UUID) is specified to separate parts in the multipart/form-data content. It’s used in headers and to indicate where each part starts and ends.
  2. 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.
  3. Headers:
    • Set the Content-Type header to multipart/form-data with the boundary value.
  4. HttpClient:
    • HttpClient sends the HTTP POST request, and BodyPublishers.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.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.