Okay, so I am trying to upload an audio file to a server using Java/Apache-HttpComponents. Server expects that file's MimeType be "audio/wav". Here is what i am trying:
File file = new File("testfile2.wav");
HttpPost httpPost = new HttpPost(uploadURL);
HttpResponse httpResponse;
String htmlResponse = "";
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
FileBody fileBody = new FileBody(file, ContentType.create("audio/wav"));
builder.addPart("mediaListForm.mediaForms[0].description", new StringBody("RBT Name", ContentType.TEXT_PLAIN));
builder.addPart("mediaListForm.mediaForms[0].artistId", new StringBody("2649", ContentType.TEXT_PLAIN));
builder.addPart("mediaListForm.mediaForms[0].categoryId", new StringBody("2", ContentType.TEXT_PLAIN));
builder.addPart("mediaListForm.mediaForms[0].file;", fileBody);
httpPost.setEntity(builder.build());
If i do not specify MimeType then default MimeType is sent as "application/octet-stream" and server rejects my request. If I specify mime type as above new FileBody(file, ContentType.create("audio/wav"));
then Server says Invalid value for field mediaListForm.mediaForms[0].file
. I tried debugging and explored request object which is like this:
------WebKitFormBoundaryqQFxF4y3FTYY3pEf
Content-Disposition: form-data; name="mediaListForm.mediaForms[0].file";
Content-Type: audio/wav
File name is missing from my request, any suggestions?
Not sure about why wouldn't method below work:
builder.addPart("mediaListForm.mediaForms[0].file", fileBody);
//If filebody contains custom contentType it does not work otherwise file is uploaded but server rejects it because of invalid contentType
Now there are multiple methods for adding file to our entity, some methods expect FileInputStream some expects File, use the one expected by server like I tried FileInputStream it server threw an exception and I figured it out that I had to send File instead, so this method worked like a charm.
builder.addBinaryBody("mediaListForm.mediaForms[0].file", file, ContentType.create("audio/wav"), rbt.getFullPath());