¿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:
- Consumir métodos personalizados de solicitud con Android
- No puedo hacer un nuevo nuevoRequestQueue en Volley, android
- Cómo cargar la imagen en el servidor en Android?
- Agregar cabecera a todas las solicitudes con Retrofit 2
- Programación de Android - Publicar formulario de Google / Spreedsheet (REQUIRED FIELD)
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));
- Cómo solucionar el error "Uso no válido de BasicClientConnManager: Asegúrese de liberar la conexión antes de asignar otra" en Android?
- Android: Cómo enviar la solicitud http a través del servicio cada 10 segundos
- La mejor manera de enviar solicitudes HTTP GET ansynchronously en Android?
- Subir fotos usando HttpPost MultiPartEntityBuilder
- Google TTS API para árabe, chino y griego
- android esperando respuesta del servidor
- Compartir cookies desde la vista web con BasicHttpRequest en Android
- Android Volley método de eliminación, ¿por qué enviar parámetros vacíos
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:
- Trabajo POST Multipart Solicitud con Volley y sin HttpEntity
- Cómo enviar un POST "multipart / form-data" en Android con Volley
- Problema Envío de archivos multipart con límite a través de Volley
Espero que esto ayude
- Android Anotaciones: Clase anotada Xyz_ no encontrando su original ("no se puede encontrar la clase de símbolo Xyz")
- Reutilización de objetos de vista de Android: impide que el tamaño antiguo se muestre cuando se vuelve a ver