How set custom 'Content-Disposition' Header in POST request in Java?

733 Views Asked by At

The server I am sending a POST request to requires extra parameters in the Content-Disposition field that are easily added in C# code, but I am struggling to replicate this functionality in Java. The working C# code:

    using (var content = new MultipartFormDataContent()) {
        var fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes("filepath"));
        fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
        {
            Name = "file",
            FileName = "file.zip.encrypted",
        };
        
        fileContent.Headers.ContentDisposition.Parameters.Add(new NameValueHeaderValue("Type", "CSV"));
        fileContent.Headers.ContentDisposition.Parameters.Add(new NameValueHeaderValue("Token", jwt));

        content.Add(fileContent);
 
        var requestUri = "url";

        var result = client.PostAsync(requestUri, content).Result;

When I print the above request headers the Content-Disposition header looks like:

Content-Disposition: form-data; name=file; filename=file.zip.encrypted; Type=CSV; Token=jwt

Attempting to replicate this POST request in Java Apache Http:

 File file = new File("filepath");

      String headerValue = "form-data; name=file; filename=\"file.zip.encrypted\"; Type=\"CSV\"; Token=\""+jwtToken+"\"";
      
      try (CloseableHttpClient client2 = HttpClients.createDefault()) {
        HttpPost post2 = new HttpPost(url);
        HttpEntity entity = MultipartEntityBuilder.create().addPart("file", new FileBody(file)).build();
        post2.setHeader("Content-Disposition", headerValue);
        post2.setEntity(entity);
        try (CloseableHttpResponse response2 = client2.execute(post2)) {
          System.out.println(response2.toString());
        }
      }

However, when I print the Headers in this request, only the name and filename fields are captured, and not the other parameters required in the Content-Disposition header. This is leading to Internal Server Error responses, as the Header does not contain the required parameters. (tried with and without the added quotes around field values)

Content-Disposition: form-data; name="file"; filename="file.zip.encrypted"

Any help getting the C# POST request behavior replicated in Java would be greatly appreciated, thanks!

0

There are 0 best solutions below