partmap android multipart retrofit

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)); }