package dk.slott.super_volley.requests;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map.Entry;
import HttpMultipartMode.SimpleMultipartEntity;
import android.util.Log;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.HttpHeaderParser;
import dk.slott.super_volley.managers.QueryMap;
// http://stackoverflow.com/questions/16797468/how-to-send-a-multipart-form-data-post-in-android-with-volley
public class MultipartRequest extends Request<String> {
private SimpleMultipartEntity entity = new SimpleMultipartEntity();
private static final String FILE_PART_NAME = "upfile";
private static final String TAG = MultipartRequest.class.getSimpleName();
private final Response.Listener<String> mListener;
private final byte[] mFilePart;
private QueryMap queryMap;
// private final String mStringPart;
public MultipartRequest(final String url, final QueryMap queryMap, Response.ErrorListener errorListener, Response.Listener<String> listener, byte[] file) {
super(Method.POST, url, errorListener);
this.mListener = listener;
this.mFilePart = file;
this.queryMap = queryMap;
buildMultipartEntity();
}
private void buildMultipartEntity() {
Log.d(TAG, "buildMultipartEntity");
entity.addFile(FILE_PART_NAME, mFilePart,"application/zip");
Log.d(TAG, "Adding query map entries to multipart request.");
for(Entry<String, Object> entry : this.queryMap.entrySet())
if(entry.getValue() != null)
entity.addPart(entry.getKey(), entry.getValue().toString());
}
@Override
public String getBodyContentType() {
Log.d(TAG, "getBodyContentType");
return entity.getContentType().getValue();
}
@Override
public byte[] getBody() throws AuthFailureError {
Log.d(TAG, "getBody");
final 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) {
Log.d(TAG, "parseNetworkResponse");
try {
final String data = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
Log.d(TAG, "data: " + data);
} catch (UnsupportedEncodingException e) {
Log.e(TAG, "UnsupportedEncodingException: " + e);
}
return Response.success("Uploaded", getCacheEntry());
}
@Override
protected void deliverResponse(String response) {
Log.d(TAG, "deliverResponse: " + response);
this.mListener.onResponse(response);
}
}