2010-10-12 12 views
10

Come parte della mia app per Android, vorrei caricare bitmap per essere archiviati in remoto. Ho una semplice comunicazione HTTP GET e POST che funziona perfettamente, ma la documentazione su come fare un POST multipart sembra essere rara quanto gli unicorni.Caricamento multiparte Android

Inoltre, mi piacerebbe trasmettere l'immagine direttamente dalla memoria, invece di lavorare con un file. Nel codice di esempio riportato di seguito, ricevo un array di byte da un file da utilizzare in seguito con HttpClient e 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); 

Tutto questo sembra abbastanza chiaro per me, se non che io non posso per la vita di me scoprire dove per ottenere questo ByteArrayPartSource. Ho collegato i file JAR httpclient e httpmime, ma senza dadi. Ho sentito che la struttura del pacchetto è cambiata drasticamente tra HttpClient 3.xe 4.x.

Qualcuno sta utilizzando questo ByteArrayPartSource in Android e come l'ha importato?

Dopo aver scavato nella documentazione e aver setacciato Internet, ho trovato qualcosa che rispondesse alle mie esigenze. Per effettuare una richiesta più parti come ad esempio un modulo POST, il codice seguente ha fatto il trucco per me:

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

Il bit HTTPMultipartMode.BROWSER_COMPATIBLE è molto importante. Grazie a Radomir's blog su questo.

+0

Se qualcuno sta cercando di risolvere l'importazione MultipartEntity. Dai un'occhiata a questo post del blog con i link al http: //blog.tacticalnuclearstrike del jar.it/2010/01/using-multipartentity-in-android-applications/ – Blundell

+1

Grazie per quello. Avevo lo stesso problema. Tranne ora ciò che mi preoccupa è che la dimensione del file della mia app è 3 o 4 volte più grande. Mi chiedo se potrebbe esserci un modo per aggiungere semplicemente il supporto per multipart invece di caricare 4 jar. –

risposta

2

provare questo:

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

Si prega di notare che MultipartEntity non è inclusa l'API di Android. Vedi questa risposta per un modo per ottenere le classi appropriate: http://stackoverflow.com/a/5220954/28688 – dermatthias

0

Sto avendo lo stesso problema. Sto cercando di caricare un'immagine tramite MultiPart Entity e rileva che i numerosi aggiornamenti su HttpClient/MIME stanno violando tutto. Sto cercando il seguente codice, cadendo con un errore "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) {} 
} 

Questo metodo è completamente compilabile e utilizza le httpclient-4.0.1.jar e httpmime-4.2.jar librerie, ma ancora una volta, mi ricordo che scontri nella linea commentata per me.

1

Forse è possibile eseguire il seguente passaggio per importare la libreria sul proprio Android.

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

  1. Fare clic destro del progetto e fare clic su proprietà
  2. selezionare java percorso di generazione
  3. selezionare scheda chiamata "Ordinare ed esportare"
  4. Applicarlo
  5. Completamente disinstallare il file apk con la disinstallazione adb a causa di un apk esistente non adatto alla nuova libreria
  6. installare di nuovo il tuo apk
  7. periodo è

Grazie,

Jenz

Problemi correlati