Téléchargement en plusieurs parties avec HttpClient 4

Téléchargement en plusieurs parties avec HttpClient 4

1. Vue d'ensemble

Dans ce tutoriel, nous allons illustrer comment fairea multipart upload operation using HttpClient 4.

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

Si vous voulez creuser plus profondément etlearn other cool things you can do with the HttpClient - passez àthe main HttpClient tutorial.

2. Utilisation de la méthodeAddPart

Commençons par examiner l’objetMultipartEntityBuilder versadd parts to an Http entity qui sera ensuite téléchargé via une opération POST.

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

Exemple 2.1. -Uploading a Form with Two Text Parts and a File

File file = new File(textFileName);
HttpPost post = new HttpPost("http://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'objetFile en spécifiant également la valeurContentType à utiliser par le serveur.

Notez également que la méthodeaddPart a deux arguments, agissant comme des paireskey/value 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 des méthodesaddBinaryBody etaddTextBody

Une manière plus directe de créer une entité en plusieurs parties consiste à utiliser les méthodesaddBinaryBody etAddTextBody. Ces méthodes fonctionnent pour télécharger du texte, des fichiers, des tableaux de caractères et des objetsInputStream. Illustrons comment avec des exemples simples.

Exemple 3.1. -Uploading Text and a Text File Part

HttpPost post = new HttpPost("http://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 objetsFileBody etStringBody ne sont pas nécessaires ici.

Également important, la plupart des serveurs ne vérifient pas lesContentType du corps du texte, donc la méthodeaddTextBody peut omettre la valeurContentType.

L'APIaddBinaryBody accepte unContentType - mais il estis alsopossible 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 valeurContentType n'est pas spécifiée.

Ensuite, nous allons ajouter un fichier zip en tant queInputStream, tandis que le fichier image sera ajouté en tant qu'objetFile:

Exemple 3.2. -Uploading a __ Zip File, an Image File, and a Text Part

HttpPost post = new HttpPost("http://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 valeurContentType 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 partiesInputStream. Le serveur que nous avons instancié dans la première ligne du code reconnaîtInputStreams.

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

Exemple 3.3. -Uploading a Byte Array and Text

HttpPost post = new HttpPost("http://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 leContentType - qui spécifie maintenant des données binaires.

4. Conclusion

Cet article a présenté lesMultipartEntityBuilder 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 lesHttpClient pour télécharger desa HttpEntity similaires à une entité de formulaire.

La mise en œuvre de tous ces exemples et extraits de codecan be found in our GitHub project - il s'agit d'un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.