Téléchargement en plusieurs parties avec HttpClient 4

1. Vue d'ensemble

Dans ce didacticiel, nous illustrerons comment effectuer une opération de téléchargement en plusieurs parties à l'aide de HttpClient 4 .

Nous utiliserons //echo.200please.com comme serveur de test car il est public et accepte la plupart des types de contenu.

Si vous souhaitez approfondir et apprendre d'autres choses intéressantes que vous pouvez faire avec HttpClient , rendez-vous au didacticiel principal HttpClient.

2. Utilisation de la méthode AddPart

Commençons par regarder l' objet MultipartEntityBuilder pour ajouter des parties à une entité Http qui sera ensuite téléchargée via une opération POST.

Il s'agit d'une méthode générique pour ajouter des parties à un HttpEntity représentant le formulaire.

Exemple 2.1. - Téléchargement d'un formulaire avec deux parties de texte et un fichier

File file = new File(textFileName); HttpPost post = new HttpPost("//echo.200please.com"); FileBody fileBody = new FileBody(file, ContentType.DEFAULT_BINARY); StringBody stringBody1 = new StringBody("Message 1", ContentType.MULTIPART_FORM_DATA); StringBody stringBody2 = new StringBody("Message 2", ContentType.MULTIPART_FORM_DATA); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addPart("upfile", fileBody); builder.addPart("text1", stringBody1); builder.addPart("text2", stringBody2); HttpEntity entity = builder.build(); // post.setEntity(entity); HttpResponse response = client.execute(post);

Notez que nous instancions l' objet File en spécifiant également la valeur ContentType à utiliser par le serveur.

Notez également que la méthode addPart a deux arguments, agissant comme des paires clé / valeur pour le formulaire. Celles-ci ne sont pertinentes que si le côté serveur attend et utilise réellement des noms de paramètres - sinon, ils sont simplement ignorés.

3. Utilisation de la addBinaryBody et addTextBody Méthodes

Un moyen plus direct de créer une entité en plusieurs parties consiste à utiliser les méthodes addBinaryBody et AddTextBody . Ces méthodes fonctionnent pour télécharger du texte, des fichiers, des tableaux de caractères et des objets InputStream . Illustrons comment avec des exemples simples.

Exemple 3.1. - Téléchargement de texte et d'une partie de fichier texte

HttpPost post = new HttpPost("//echo.200please.com"); File file = new File(textFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", file, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.DEFAULT_BINARY); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Notez que les objets FileBody et StringBody ne sont pas nécessaires ici.

Également important, la plupart des serveurs ne vérifient pas le ContentType du corps du texte, de sorte que la méthode addTextBody peut omettre la valeur ContentType .

L' API addBinaryBody accepte un ContentType - mais il est également possible de créer l'entité uniquement à partir d'un corps binaire et du nom du paramètre de formulaire contenant le fichier. Comme indiqué dans la section précédente, certains serveurs ne reconnaîtront pas le fichier si la valeur ContentType n'est pas spécifiée.

Ensuite, nous ajouterons un fichier zip comme InputStream, tandis que le fichier image sera ajouté en tant qu'objet File :

Exemple 3.2. - Téléchargement d'unFichier Zip, un fichier image et une partie de texte

HttpPost post = new HttpPost("//echo.200please.com"); InputStream inputStream = new FileInputStream(zipFileName); File file = new File(imageFileName); String message = "This is a multipart post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", file, ContentType.DEFAULT_BINARY, imageFileName); builder.addBinaryBody ("upstream", inputStream, ContentType.create("application/zip"), zipFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Notez que la valeur ContentType peut être créée à la volée, comme c'est le cas dans l'exemple ci-dessus pour le fichier zip.

Enfin, tous les serveurs ne reconnaissent pas les composants InputStream . Le serveur que nous avons instancié dans la première ligne du code reconnaît InputStream s.

Regardons maintenant un autre exemple où addBinaryBody travaille directement avec un tableau d'octets:

Exemple 3.3. - Téléchargement d'un tableau d'octets et d'un texte

HttpPost post = new HttpPost("//echo.200please.com"); String message = "This is a multipart post"; byte[] bytes = "binary code".getBytes(); // MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody("text", message, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build(); post.setEntity(entity); HttpResponse response = client.execute(post);

Notez le ContentType - qui spécifie maintenant des données binaires.

4. Conclusion

Cet article a présenté le MultipartEntityBuilder comme un objet flexible qui offre plusieurs choix d'API pour créer un formulaire en plusieurs parties.

Les exemples ont également montré comment utiliser HttpClient pour télécharger un HttpEntity similaire à une entité de formulaire.

L'implémentation de tous ces exemples et extraits de code peut être trouvée dans notre projet GitHub - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.