Im finishing this project which is using okhttp for communication with a webservice.
All is going fine for regular GETs and POSTs, but I'm not being able to properly upload a file.
The okhttp docs are very lacking on these subjects and everything I found here or anywhere don't seem to work in my case.
It's supposed to be simple: I have to send both the file and some string values. But I can't figured out how to do it.
Following the some samples I found, I first tried this:
RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM)
.addFormDataPart("group", getGroup())
.addFormDataPart("type", getType())
.addFormDataPart("entity", Integer.toString(getEntity()))
.addFormDataPart("reference", Integer.toString(getReference()))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"task_file\""), RequestBody.create(MediaType.parse("image/png"), getFile()))
.build();
It gives me a "400 bad request" error.
So I tried this from the okhttp recipes:
RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM)
.addPart(Headers.of("Content-Disposition", "form-data; name=\"group\""), RequestBody.create(null, getGroup()))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"type\""), RequestBody.create(null, getType()))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"entity\""), RequestBody.create(null, Integer.toString(getEntity())))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"reference\""), RequestBody.create(null, Integer.toString(getReference())))
.addPart(Headers.of("Content-Disposition", "form-data; name=\"task_file\""), RequestBody.create(MediaType.parse("image/png"), getFile()))
.build();
Same result.
Don't know what else to try or what look into to debug this.
The request is done with this code:
// adds the required authentication token
Request request = new Request.Builder().url(getURL()).addHeader("X-Auth-Token", getUser().getToken().toString()).post(requestBody).build();
Response response = client.newCall(request).execute();
But Im pretty sure that the problem is how Im building the request body.
What am I doing wrong?
EDIT: "getFile()" above returns the a File object, by the way. The rest of the parameters are all strings and ints.
But if you want to send both string parameters and multiple media content, you can use okhttp3.MultipartBody. // Create upload file content mime type. MediaType fileContentType = MediaType.parse ("File/*"); String uploadFileRealPath = "/sdcard/Movies/test.txt"; // Create file object.
OkHttp Overview. OkHttp is an efficient HTTP & HTTP/2 client for Android and Java applications. It comes with advanced features such as connection pooling (if HTTP/2 isn’t available), transparent GZIP compression, and response caching to avoid the network completely for repeated requests.
2. OkHttp Overview OkHttp is an efficient HTTP & HTTP/2 client for Android and Java applications. It comes with advanced features such as connection pooling (if HTTP/2 isn’t available), transparent GZIP compression, and response caching to avoid the network completely for repeated requests.
OkHttp's default character encoding is UTF-8: If we want to use a different character encoding, we can pass it as the second parameter of the MediaType.parse (): 7. Conclusion In this short article, we saw several examples of POST requests with the OkHttp client.
I found answer to my own question a bit after initial post.
I´ll leave it here, because it can be useful to others, given that there is such a few okhttp upload examples around:
RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM)
.addFormDataPart("group", getGroup())
.addFormDataPart("type", getType())
.addFormDataPart("entity", Integer.toString(getEntity()))
.addFormDataPart("reference", Integer.toString(getReference()))
.addFormDataPart("task_file", "file.png", RequestBody.create(MediaType.parse("image/png"), getFile()))
.build();
There is no reason to use "addPart" with "Headers.of" etc like in the recipes, addFormDataPart does the trick.
And for the file field itself, it takes 3 arguments: name, filename and then the file body. That's it.
I just changed addFormDataPart
instead addPart
and Finally solved My Problem Using following code:
/**
* Upload Image
*
* @param memberId
* @param sourceImageFile
* @return
*/
public static JSONObject uploadImage(String memberId, String sourceImageFile) {
try {
File sourceFile = new File(sourceImageFile);
Log.d(TAG, "File...::::" + sourceFile + " : " + sourceFile.exists());
final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addFormDataPart("member_id", memberId)
.addFormDataPart("file", "profile.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile))
.build();
Request request = new Request.Builder()
.url(URL_UPLOAD_IMAGE)
.post(requestBody)
.build();
OkHttpClient client = new OkHttpClient();
Response response = client.newCall(request).execute();
return new JSONObject(response.body().string());
} catch (UnknownHostException | UnsupportedEncodingException e) {
Log.e(TAG, "Error: " + e.getLocalizedMessage());
} catch (Exception e) {
Log.e(TAG, "Other Error: " + e.getLocalizedMessage());
}
return null;
}
in OKHTTP 3+ use this AsyncTask
SignupWithImageTask
public class SignupWithImageTask extends AsyncTask<String, Integer, String> {
ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(SignupActivity.this);
progressDialog.setMessage("Please Wait....");
progressDialog.show();
}
@Override
protected String doInBackground(String... str) {
String res = null;
try {
// String ImagePath = str[0];
String name = str[0], email = str[1], dob = str[2], IMEI = str[3], phone = str[4], ImagePath = str[5];
File sourceFile = new File(ImagePath);
Log.d("TAG", "File...::::" + sourceFile + " : " + sourceFile.exists());
final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/*");
String filename = ImagePath.substring(ImagePath.lastIndexOf("/") + 1);
/**
* OKHTTP2
*/
// RequestBody requestBody = new MultipartBuilder()
// .type(MultipartBuilder.FORM)
// .addFormDataPart("member_id", memberId)
// .addFormDataPart("file", "profile.png", RequestBody.create(MEDIA_TYPE_PNG, sourceFile))
// .build();
/**
* OKHTTP3
*/
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("image", filename, RequestBody.create(MEDIA_TYPE_PNG, sourceFile))
.addFormDataPart("result", "my_image")
.addFormDataPart("name", name)
.addFormDataPart("email", email)
.addFormDataPart("dob", dob)
.addFormDataPart("IMEI", IMEI)
.addFormDataPart("phone", phone)
.build();
Request request = new Request.Builder()
.url(BASE_URL + "signup")
.post(requestBody)
.build();
OkHttpClient client = new OkHttpClient();
okhttp3.Response response = client.newCall(request).execute();
res = response.body().string();
Log.e("TAG", "Response : " + res);
return res;
} catch (UnknownHostException | UnsupportedEncodingException e) {
Log.e("TAG", "Error: " + e.getLocalizedMessage());
} catch (Exception e) {
Log.e("TAG", "Other Error: " + e.getLocalizedMessage());
}
return res;
}
@Override
protected void onPostExecute(String response) {
super.onPostExecute(response);
if (progressDialog != null)
progressDialog.dismiss();
if (response != null) {
try {
JSONObject jsonObject = new JSONObject(response);
if (jsonObject.getString("message").equals("success")) {
JSONObject jsonObject1 = jsonObject.getJSONObject("data");
SharedPreferences settings = getSharedPreferences("preference", 0); // 0 - for private mode
SharedPreferences.Editor editor = settings.edit();
editor.putString("name", jsonObject1.getString("name"));
editor.putString("userid", jsonObject1.getString("id"));
editor.putBoolean("hasLoggedIn", true);
editor.apply();
new UploadContactTask().execute();
startActivity(new Intent(SignupActivity.this, MainActivity.class));
} else {
Toast.makeText(SignupActivity.this, "" + jsonObject.getString("message"), Toast.LENGTH_SHORT).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
} else {
Toast.makeText(SignupActivity.this, "Something Went Wrong", Toast.LENGTH_SHORT).show();
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With