2010-10-12 6 views
10

Dans le cadre de mon application Android, je souhaite télécharger des bitmaps à stocker à distance. J'ai une simple communication HTTP GET et POST fonctionnant parfaitement, mais la documentation sur la façon de faire un POST multipart semble être aussi rare que les licornes.Android Multipart Upload

En outre, je voudrais transmettre l'image directement de la mémoire, au lieu de travailler avec un fichier. Dans l'exemple de code ci-dessous, j'obtiens un tableau d'octets à partir d'un fichier à utiliser plus tard avec HttpClient et 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); 

Tout cela semble assez clair pour moi, sauf que je ne peux pas pour la vie de me trouver où obtenir ce ByteArrayPartSource. J'ai lié aux dossiers de JAR de httpclient et de httpmime, mais aucun dés. J'entends que la structure du paquet a changé radicalement entre HttpClient 3.x et 4.x.

Est-ce que quelqu'un utilise ce ByteArrayPartSource dans Android, et comment l'a-t-il importé? Après avoir exploré la documentation et parcouru Internet, j'ai trouvé quelque chose qui correspond à mes besoins. Pour faire une demande multipart comme un formulaire POST, le code suivant fait l'affaire pour moi:

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

Le bit HTTPMultipartMode.BROWSER_COMPATIBLE est très important. Merci à Radomir's blog sur celui-ci.

+0

Si quelqu'un cherche à résoudre l'importation MultipartEntity. Découvrez ce billet de blog avec des liens vers http: //blog.tacticalnuclearstrike.com/2010/01/using-multipartentity-in-android-applications/ – Blundell

+1

Merci pour cela. J'avais le même problème. Sauf que maintenant ce qui m'inquiète, c'est que la taille de mon application est 3 ou 4 fois plus grande. Je me demande s'il pourrait y avoir un moyen d'ajouter simplement le support pour multipart au lieu de charger 4 jars. –

Répondre

2

essayez ceci:

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

Veuillez noter que MultipartEntity n'est pas inclus dans l'API Android. Voir cette réponse pour un moyen d'obtenir les classes appropriées: http://stackoverflow.com/a/5220954/28688 – dermatthias

0

Je vais avoir le même problème. J'essaie de télécharger une image via Multipart Entity et il se trouve que les plusieurs mises à jour sur HttpClient/MIME sont tout casser. J'essaie le code suivant, tombant avec une erreur « 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) {} 
} 

Cette méthode est entièrement compilable et utilise les httpclient-4.0.1.jar et httpmime-4.2.jar libs, mais encore une fois, je me souviens qu'il Crashs dans la ligne commentée pour moi.

1

Peut-être que vous pouvez faire l'étape suivante pour importer la bibliothèque dans votre Android.

bibliothèque exigence - apache-mime4j-0.6.jar - httpmime-4.0.1.jar

  1. clic droit de votre projet et cliquez sur Propriétés
  2. Chemin de génération java
  3. sélectionnez l'onglet appelés "Order and Export"
  4. Appliquer
  5. Entièrement désinstaller votre fichier apk avec la désinstallation adb en raison de apk existant ne répond pas à la nouvelle bibliothèque
  6. installer à nouveau votre apk
  7. terme, il

Merci,

Jenz