2010-10-12 8 views
10

Como parte de mi aplicación para Android, me gustaría cargar mapas de bits para que se guarden remotamente. Tengo comunicación HTTP GET y POST simple funcionando perfectamente, pero la documentación sobre cómo hacer una POST multiparte parece ser tan rara como unicornios.Carga parcial de Android

Además, me gustaría transmitir la imagen directamente desde la memoria, en lugar de trabajar con un archivo. En el siguiente código de ejemplo, obtengo una matriz de bytes de un archivo para usarla más adelante con HttpClient y MultipartEntity.

File input = new File("climb.jpg"); 
    byte[] data = new byte[(int)input.length()]; 
    FileInputStream fis = new FileInputStream(input); 
    fis.read(data); 

    ByteArrayPartSource baps = new ByteArrayPartSource(input.getName(), data); 

Todo esto parece bastante claro para mí, excepto que no puedo por la vida de mí averiguar dónde conseguir este ByteArrayPartSource. Me he vinculado a los archivos httpclient y httpmime JAR, pero no a los dados. Escuché que la estructura del paquete cambió drásticamente entre HttpClient 3.xy 4.x.

¿Alguien está usando este ByteArrayPartSource en Android, y cómo lo importaron?

Después de hurgar en la documentación y buscar en Internet, se me ocurrió algo que se ajustaba a mis necesidades. Para realizar una solicitud de varias partes, como un formulario POST, el código siguiente hizo el truco para mí:

File input = new File("climb.jpg"); 

    DefaultHttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("http://localhost:3000/routes"); 
    MultipartEntity multi = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
    String line; 

    multi.addPart("name", new StringBody("test")); 
    multi.addPart("grade", new StringBody("test")); 
    multi.addPart("quality", new StringBody("test")); 
    multi.addPart("latitude", new StringBody("40.74")); 
    multi.addPart("longitude", new StringBody("40.74")); 
    multi.addPart("photo", new FileBody(input)); 
    post.setEntity(multi); 

    HttpResponse resp = client.execute(post); 

El bit HTTPMultipartMode.BROWSER_COMPATIBLE es muy importante. Gracias a Radomir's blog en este caso.

+0

Si alguien está buscando para resolver la importación MultipartEntity. Echa un vistazo a esta publicación de blog con enlaces a http: //blog.tacticalnuclearstrike del jar.com/2010/01/using-multipartentity-in-android-applications/ – Blundell

+1

Gracias por eso. Estaba teniendo el mismo problema. Excepto que ahora lo que me preocupa es que el tamaño del archivo de mi aplicación es 3 o 4 veces mayor. Me pregunto si podría haber una manera de simplemente agregar soporte para multiparte en lugar de cargar 4 jarras. –

Respuesta

2

probar esto:

HttpClient httpClient = new DefaultHttpClient() ; 

HttpPost httpPost = new HttpPost("http://example.com"); 
MultipartEntity entity = new MultipartEntity();  
entity.addPart("file", new FileBody(file)); 
httpPost.setEntity(entity); 
HttpResponse response = null; 

try { 
    response = httpClient.execute(httpPost); 
} catch (ClientProtocolException e) { 
    Log.e("ClientProtocolException : "+e, e.getMessage());   
} catch (IOException e) { 
    Log.e("IOException : "+e, e.getMessage()); 

} 
+1

Tenga en cuenta que MultipartEntity no está incluido en la API de Android. Consulte esta respuesta para obtener las clases apropiadas: http://stackoverflow.com/a/5220954/28688 – dermatthias

0

estoy teniendo el mismo problema. Estoy intentando subir una imagen a través de MultiPart Entity y veo que las diversas actualizaciones en HttpClient/MIME están descifrando todo. Estoy intentando el siguiente código, que cae con un error "NoClassDefFoundError":

public static void executeMultipartPost(File image, ArrayList<Cookie> cookies, String myUrlToPost) { 
    try { 
     // my post instance 
     HttpPost httppost = new HttpPost(myUrlToPost); 
     // setting cookies for the connection session 
     if (cookies != null && cookies.size() > 0) { 
      String cookieString = ""; 
      for (int i=0; i<cookies.size(); ++i) { 
       cookieString += cookies.get(i).getName()+"="+cookies.get(i).getValue()+";"; 
      } 
      cookieString += "domain=" + BaseUrl + "; " + "path=/"; 
      httppost.addHeader("Cookie", cookieString); 
     } 
     // creating the http client 
     HttpClient httpclient = new DefaultHttpClient(); 
     // creating the multientity part [ERROR OCCURS IN THIS BELLOW LINE] 
     MultipartEntity multipartEntity = new MultipartEntity(); 
     multipartEntity.addPart("photoupload", new FileBody(image)); 
     httppost.setEntity(multipartEntity); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity resEntity = response.getEntity(); 
    } catch (Exception e) {} 
} 

Este método es totalmente compilables y utiliza los httpclient-4.0.1.jar y httpmime-4.2.jar libs, pero una vez más, recuerdo que crashs en la línea comentada para mi.

1

Quizás pueda hacer lo siguiente para importar la biblioteca en su Android.

requisito biblioteca - Apache-mime4j-0.6.jar - httpmime-4.0.1.jar

  1. Haga clic derecho en el proyecto y en Propiedades del
  2. seleccione Java trayectoria de la estructura
  3. seleccione pestaña llamada "Orden y exportación"
  4. Aplicar
  5. que desinstalar completamente archivo APK con la desinstalación ADB debido a la existente apk no atender a la nueva biblioteca
  6. instalación de nuevo para su apk
  7. plazo que

Gracias,

JENZ

Cuestiones relacionadas