Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


¿Cómo subir el archivo usando la biblioteca Volley en android?

Ya tengo una subclase de solicitud que se utiliza para la publicación http en el servidor. El problema es, no tengo ni idea de cómo puedo agregar un parámetro para un archivo. Publicar cadena en el servidor es fácil. Pero necesito agregar el archivo como diverso parámetro. ¿Cómo puedo hacerlo?

public class AddNewPetRequest extends Request<JSONObject> { private Response.Listener<JSONObject> listener; public AddNewPetRequest(String url, Map<String, String> params, Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) { super(Request.Method.GET, url, errorListener); this.listener = reponseListener; this.params = params; } public AddNewPetRequest(int method, String url, Map<String, String> params, Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) { super(method, url, errorListener); this.listener = reponseListener; this.params = params; } protected Map<String, String> getParams() throws com.android.volley.AuthFailureError { return params; }; @Override protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { try { String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response)); } catch (UnsupportedEncodingException e) { return Response.error(new ParseError(e)); } catch (JSONException je) { return Response.error(new ParseError(je)); } } @Override protected void deliverResponse(JSONObject response) { // TODO Auto-generated method stub listener.onResponse(response); } } 

PREGUNTA DE ACTUALIZACIÓN: Sigo el patrón de una de las respuestas aquí en stackoverflow y me vine con esta implementación:

 public class MultipartRequest extends Request<String> { private MultipartEntity entity = new MultipartEntity(); private final Response.Listener<String> mListener; private HashMap<String, String> mParams; public MultipartRequest(String url, Response.ErrorListener errorListener, Response.Listener<String> listener) { super(Method.POST, url, errorListener); mListener = listener; buildMultipartEntity(); } private void buildMultipartEntity() { entity.addPart("profile_picture", new FileBody(new File("/storage/emulated/0/Pictures/VSCOCam/2015-07-31 11.55.14 1.jpg"))); try { entity.addPart("user_id", new StringBody("15")); entity.addPart("name", new StringBody("Bogs")); entity.addPart("gender", new StringBody("Male")); entity.addPart("date_birth", new StringBody("1999-12-5")); entity.addPart("breed", new StringBody("monkey")); } 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); } 

Cuando agrego esta petición a mi cola de la petición, respondo un com.android.volley.TimeoutError pero si una comprobación la base de datos, la petición ejecuta y agrega artículos a la tabla pero la carga de la imagen del perfil tiene solamente 1 byte de tamaño. Otro problema, mi elemento de base de datos agregado dos veces.

PROBLEMA SOLUCIONADO Ya lo arreglé fijando su tiempo de solicitud. Lo que sucedió es que no soy capaz de obtener la respuesta de mi servidor después del tiempo de espera predeterminado de volley biblioteca para establecer mi tiempo de espera llamando y estableciendo este método a mi cola de solicitud:

 multipartRequest.setRetryPolicy(new DefaultRetryPolicy(1000 * 60, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.