How to send a “multipart/form-data” POST in Android with Volley
I might be wrong on this but I think you need to implement your own com.android.volley.toolbox.HttpStack
for this because the default ones (HurlStack
if version > Gingerbread or HttpClientStack
) don't deal with multipart/form-data
.
Edit:
And indeed I was wrong. I was able to do it using MultipartEntity
in Request like this:
public class MultipartRequest extends Request<String> {
private MultipartEntity entity = new MultipartEntity();
private static final String FILE_PART_NAME = "file";
private static final String STRING_PART_NAME = "text";
private final Response.Listener<String> mListener;
private final File mFilePart;
private final String mStringPart;
public MultipartRequest(String url, Response.ErrorListener errorListener, Response.Listener<String> listener, File file, String stringPart)
{
super(Method.POST, url, errorListener);
mListener = listener;
mFilePart = file;
mStringPart = stringPart;
buildMultipartEntity();
}
private void buildMultipartEntity()
{
entity.addPart(FILE_PART_NAME, new FileBody(mFilePart));
try
{
entity.addPart(STRING_PART_NAME, new StringBody(mStringPart));
}
catch (UnsupportedEncodingException e)
{
VolleyLog.e("UnsupportedEncodingException");
}
}
@Override
public String getBodyContentType()
{
return entity.getContentType().getValue();
}
@Override
public byte[] getBody() throws AuthFailureError
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try
{
entity.writeTo(bos);
}
catch (IOException e)
{
VolleyLog.e("IOException writing to ByteArrayOutputStream");
}
return bos.toByteArray();
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response)
{
return Response.success("Uploaded", getCacheEntry());
}
@Override
protected void deliverResponse(String response)
{
mListener.onResponse(response);
}
}
It's pretty raw but I tried it with an image and a simple string and it works. The response is a placeholder, doesn't make much sense to return a Response String in this case. I had problems using apache httpmime to use MultipartEntity so I used this https://code.google.com/p/httpclientandroidlib/ don't know if there's a better way.
Hope it helps.
Edit
You can use httpmime without using httpclientandroidlib, the only dependency is httpcore.
Can't send multpart/form-data with Volley
The solution that worked for me is remove the line that setting Content-Type from header!
Related Topics
How to Filter Specific Apps For Action_Send Intent (And Set a Different Text For Each App)
Android Check Internet Connection
Android Saving File to External Storage
Android Fragment Handle Back Button Press
Programmatically Register a Broadcast Receiver
Android Studio 3.5 Refactor Issue
Sharedpreferences.Onsharedpreferencechangelistener Not Being Called Consistently
Android Intent Filter For a Particular File Extension
How to Set the Part of the Text View Is Clickable
Firebase Onmessagereceived Not Called When App in Background
Service VS Intentservice in the Android Platform
Different Resolution Support Android
Get Visible Items in Recyclerview
Android Broadcastreceiver on Startup - Keep Running When Activity Is in Background