2010-03-30 12 views
6

tengo que subir una imagen a un servidor PHP remota que espera los siguientes parámetros en HttpPost:Cargar imágenes a un servidor PHP desde Android

*$_POST['title']* 
*$_POST['caption']* 
*$_FILES['fileatt']* 

La mayoría de las búsquedas en Internet sugiere ya sea:

descargar las siguientes clases y tratando MultiPartEntity para enviar la solicitud:

apache-mime4j-0.5.jar 
httpclient-4.0-beta2.jar 
httpcore-4.0-beta3.jar 
httpmime-4.0-beta2.jar 

O

Use URLconnection y maneje datos multiparte yo mismo.

Btw, estoy interesado en usar clase HttpClient en lugar de java.net (o es android.net) clases. Finalmente, descargué las clases Multipart del código fuente de Android y las utilicé en mi proyecto.

Aunque esto se puede hacer mediante cualquiera de los métodos mencionados anteriormente, me gustaría asegurarme de que estas sean las únicas formas de lograr dicho objetivo. Revisé la documentación y encontré una clase FileEntity pero no pude hacerlo funcionar.

¿Cuál es la forma correcta de hacerlo en una aplicación de Android?

Gracias.

+0

Para una fácil implementación, consulte mi [publicación] (http://vikaskanani.wordpress.com/2011/01/11/android-upload-image-or-file-using-http-post-multi-part/). – Vikas

Respuesta

5

La fuente de Android parece venir con una biblioteca de ayuda interna de varias partes. See this post. A primera vista, está mejor documentado que muchos API públicos (tos para la tos, SoundPool, tos para la tos), por lo que debería ser un buen lugar para comenzar, o posiblemente sea una solución sencilla.

+0

Sí, también vi ese hilo y pude descargar el paquete "multiparte" y usarlo simplemente cambiando los nombres de los paquetes. Gracias por su respuesta. – Samuh

+1

También puede consultar el proyecto oficial Apache HTTPMime: http://hc.apache.org/httpcomponents-client/httpmime/apidocs/index.html Está basado en Mime4j y no lo he usado personalmente, pero parece que pretenden hacer multiparte en HTTPClient 4; probablemente funcione con el HTTPClient de Android, pero no puedo asegurarlo. –

3

Hago exactamente eso para interactuar con un servidor de alojamiento de imágenes (implementado también en php) que espera parámetros como si se publicaran desde una página html.

construyo un List<NameValuePair> de mis claves y valores algo como esto:

List<NameValuePair> params = new ArrayList<NameValuePair>(2); 
    params.add(new BasicNameValuePair(key1, value1)); 
    params.add(new BasicNameValuePair(key2, value2)); 

y luego lo paso a mi clase de ayuda http que establece la propiedad HttpEntity de mi solicitud HttpPost. Aquí está el método directamente de mi clase de ayuda:

public static HttpResponse Post(String url, List<NameValuePair> params, Context context) 
{ 
    HttpResponse response = null; 
    try 
    { 
     HttpPost request = new HttpPost(); 
     request.setURI(new URI(url)); 
     if(params != null) 
      request.setEntity(new UrlEncodedFormEntity(params)); 
     HttpClient client = ((ApplicationEx)context.getApplicationContext()).getHttpClient(); 
     response = client.execute(request); 
    } 
    catch(Exception ex) 
    { 
     // log, etc 
    } 
    return response; 
} 
+0

¿Qué tipo de objeto de entidad crea exactamente para encapsular un objeto de archivo? – Samuh

+0

Bueno ... si fuera el propietario de ambos lados del contrato, no usaría la matriz $ _FILES ... enviaría un par clave/valor regular como un param post donde el valor es una secuencia de bytes. Si solo tengo el cliente y el servidor requiere estrictamente el material $ _FILES, crearía una página html de prueba con un formulario simple que hace exactamente eso (carga del archivo), lo rastrea con el violín y crea la carga útil de la publicación manualmente para reflejar los encabezados y la carga útil. El navegador crea una cadena de "límites", le dice al servidor cuál es el límite a través de un encabezado, y luego encierra la secuencia de bytes en este límite. Puedes hacer lo mismo. – Rich

+0

Eso es exactamente lo que quise decir cuando dije: Use URLconnection y maneje datos multiparte yo mismo. Lo que realmente quiero es una clase como MultipartEntity que maneje todo eso por mí. Desafortunadamente, esta clase no fue importada de Android. La documentación, sin embargo, incluye una clase FileEntity y me preguntaba cómo usarla. – Samuh

4

Tal vez este post en el grupo oficial de Android ayuda. El tipo está usando mime4j.

Otro recurso útil podría ser this example en el libro Pro Android.

Cuestiones relacionadas