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

He comentado, pero tal vez usted no ha leído todavía. Así que aquí está mi respuesta.

Si desea utilizar Volley, puede consultar algunos de los siguientes enlaces:

  1. Trabajo POST Multipart Solicitud con Volley y sin HttpEntity
  2. Cómo enviar un POST "multipart / form-data" en Android con Volley
  3. Problema Envío de archivos multipart con límite a través de Volley

Espero que esto ayude

  • Solicitud de excepción de Android en IOException al recuperar JSON de URL
  • Android: AsyncTask para hacer una solicitud HTTP GET?
  • Google http / oauth2 api siempre lanza EOFException para segundo HTTPRequest
  • ¿Cómo puedo imprimir / registrar contenido de cuerpo entero de MultiPartEntity que está siendo utilizado por HTTPRequest?
  • OkHttp / tiempo de espera de retroactivación predeterminado
  • ProtocolException: encabezado no válido:: en HTTPRequest
  • ¿Existe una manera de encontrar el tamaño completo de la solicitud HTTP y la respuesta en Android (para el seguimiento del uso de datos)?
  • Mantenga la conexión abierta y lea los datos hasta que se cierre con fuerza
  • ¿Cómo medir el tiempo de solicitud y respuesta del servidor?
  • Solicitud de Android http bloqueada por incapsula
  • Rutas dinámicas en la adaptación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.