android - partmap - send image file retrofit
"Retrofit" imágenes múltiples adjuntas en una solicitud multiparte (2)
Después de mirar a mi alrededor con la documentación proporcionada por la modificación ... No puedo hacerlo con mi propia solución, tal vez no sea tan bueno pero aún así consiga que funcione.
Aquí está la referencia MultipartTypedOutput
En realidad es bastante similar al código anterior de arriba, solo hace un poco de cambios
Interfaz
@POST("/post")
void createPostWithAttachments( @Body MultipartTypedOutput attachments,Callback<String> response);
Implementación
MultipartTypedOutput multipartTypedOutput = new MultipartTypedOutput();
multipartTypedOutput.addPart("c", new TypedString(text));
multipartTypedOutput.addPart("_t", new TypedString("user"));
multipartTypedOutput.addPart("_r", new TypedString(userData.user.id));
//loop through object to get the path of the images that has picked by user
for(int i=0;i<attachments.size();i++){
CustomGallery gallery = attachments.get(i);
multipartTypedOutput.addPart("f[]",new TypedFile("image/jpg",new File(gallery.sdcardPath)));
}
ServicesAdapter.getAuthorizeService().createPostWithAttachments(multipartTypedOutput, new Callback<String>() {
@Override
public void success(String s, Response response) {
DBLogin.updateCookie(response);
new_post_text.setText("");
try {
JSONObject json_response = new JSONObject(s);
Toast.makeText(getApplicationContext(), json_response.getString("message"), Toast.LENGTH_LONG).show();
if (json_response.getString("status").equals("success")) {
JSONObject dataObj = json_response.getJSONObject("data");
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
finish();
} else {
Log.d(TAG, "Request failed");
}
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
}
@Override
public void failure(RetrofitError retrofitError) {
Toast.makeText(getApplicationContext(), retrofitError.getMessage(), Toast.LENGTH_LONG).show();
}
});
Tal vez esta solución no sea tan buena, pero espera que ayude a alguien más.
Si hay alguna solución mejor, por favor sugiera, gracias: D
Actualizaciones
MultipartTypedOutput ya no existe en Retrofit 2.0.0-beta1
Para aquellos que quieran subir varias imágenes ahora pueden usar con @PartMap , enlace de referencia javadoc
¿Hay alguna forma de adjuntar múltiples imágenes en una solicitud multiparte? Las imágenes son dinámicas basadas en la cantidad de imágenes que el usuario ha seleccionado.
El siguiente código solo funciona para una sola imagen:
Interfaz:
@Multipart
@POST("/post")
void createPostWithAttachments( @Part("f[]") TypedFile image,@PartMap Map<String, String> params,Callback<String> response);
Implementación:
TypedFile file = new TypedFile("image/jpg", new File(gallery.sdcardPath));
Map<String,String> params = new HashMap<String,String>();
params.put("key","value");
ServicesAdapter.getAuthorizeService().createPostWithAttachments(file,params, new Callback<String>() {
@Override
public void success(String s, Response response) {
DBLogin.updateCookie(response);
new_post_text.setText("");
try {
JSONObject json_response = new JSONObject(s);
Toast.makeText(getApplicationContext(), json_response.getString("message"), Toast.LENGTH_LONG).show();
if (json_response.getString("status").equals("success")) {
JSONObject dataObj = json_response.getJSONObject("data");
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
startActivity(intent);
finish();
} else {
Log.d(TAG, "Request failed");
}
} catch (Exception e) {
Log.d(TAG, e.getMessage());
}
}
@Override
public void failure(RetrofitError retrofitError) {
Toast.makeText(getApplicationContext(), retrofitError.getMessage(), Toast.LENGTH_LONG).show();
}
});
//We need to create the Typed file array as follow and add the images path in the arrays list.
private ArrayList<TypedFile> images;
private void postService(final Context context) {
Utils.progressDialog(context);
MultipartTypedOutput multipartTypedOutput = new MultipartTypedOutput();
multipartTypedOutput.addPart("user_id",new TypedString(strUserId));
multipartTypedOutput.addPart("title", new TypedString(strJobtitle));
multipartTypedOutput.addPart("description", new TypedString(
strJobdescription));
multipartTypedOutput.addPart("experience", new TypedString(
strUserExperience));
multipartTypedOutput.addPart("category_id", new TypedString(
strPostCategory));
multipartTypedOutput.addPart("city_id", new TypedString(strCityCode));
multipartTypedOutput.addPart("country_id", new TypedString(
strCountryCode));
multipartTypedOutput.addPart("profile_doc",new TypedFile("multipart/form-data", postCurriculamFile));
for (int i = 0; i < images.size(); i++) {
multipartTypedOutput.addPart("image[]", images.get(i));
}
PostServiceClient.getInstance().postServiceData(multipartTypedOutput,
new Callback<RegistrationResponsModel>() {
@Override
public void failure(RetrofitError retrofitError) {
Logger.logMessage("fail" + retrofitError);
Utils.progressDialogdismiss(context);
}
@Override
public void success(
RegistrationResponsModel regProfileResponse,
Response arg1) {
Utils.progressDialogdismiss(context);
UserResponse(regProfileResponse);
}
});
}
@POST("/service/update") // annotation used to post the data
void postEditServiceData(@Body MultipartTypedOutput attachments,
Callback<RegistrationResponsModel> callback);
// Esta es la forma en que podemos publicar el archivo multipartTypedOutput.addPart ("profile_doc", nuevo TypedFile ("multipart / form-data", postCurriculamFile));
// Esta es la forma en que podemos publicar las múltiples imágenes.
for (int i = 0; i < images.size(); i++) {
multipartTypedOutput.addPart("image[]", images.get(i));
}