Multipart Upload mit HttpClient 4

1. Übersicht

In diesem Tutorial wird gezeigt, wie ein mehrteiliger Upload-Vorgang mit HttpClient 4 durchgeführt wird .

Wir werden //echo.200please.com als Testserver verwenden, da dieser öffentlich ist und die meisten Arten von Inhalten akzeptiert.

Wenn Sie tiefer graben und andere coole Dinge lernen möchten, die Sie mit dem HttpClient tun können, gehen Sie zum Haupt-HttpClient-Tutorial.

2. Verwenden der AddPart- Methode

Beginnen wir mit dem MultipartEntityBuilder- Objekt, um einer HTTP-Entität Teile hinzuzufügen, die dann über eine POST-Operation hochgeladen werden.

Dies ist eine generische Methode zum Hinzufügen von Teilen zu einer HttpEntity, die das Formular darstellt.

Beispiel 2.1. - Hochladen eines Formulars mit zwei Textteilen und einer Datei

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

Beachten Sie, dass wir das File- Objekt instanziieren, indem wir auch den ContentType- Wert angeben , der vom Server verwendet werden soll.

Beachten Sie außerdem, dass die addPart- Methode zwei Argumente enthält, die sich wie Schlüssel / Wert- Paare für das Formular verhalten . Diese sind nur relevant, wenn die Serverseite tatsächlich Parameternamen erwartet und verwendet - andernfalls werden sie einfach ignoriert.

3. Verwenden der Methoden addBinaryBody und addTextBody

Eine direktere Möglichkeit zum Erstellen einer mehrteiligen Entität ist die Verwendung der Methoden addBinaryBody und AddTextBody . Diese Methoden eignen sich zum Hochladen von Text, Dateien, Zeichenarrays und InputStream- Objekten. Lassen Sie uns anhand einfacher Beispiele veranschaulichen, wie.

Beispiel 3.1. - Hochladen von Text und einem Textdateiteil

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

Beachten Sie, dass die FileBody- und StringBody- Objekte hier nicht benötigt werden.

Ebenfalls wichtig, die meisten Server nicht überprüfen die Content des Textkörpers, so dass die addTextBody Methode , um die weglassen Content Wert.

Die addBinaryBody API akzeptiert eine Content - aber es ist auch möglich , die Einheit nur von einem binären Körper und den Namen des Formulars zu erstellen Parametern die Datei zu halten. Wie im vorherigen Abschnitt angegeben, erkennen einige Server die Datei nicht, wenn der ContentType- Wert nicht angegeben wird.

Als nächstes werden wir eine ZIP - Datei als hinzufügen INPUTSTREAM- während die Bilddatei als hinzugefügt wird Datei - Objekt:

Beispiel 3.2. - Hochladen aZip-Datei, eine Bilddatei und ein Textteil

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

Beachten Sie, dass der ContentType- Wert im laufenden Betrieb erstellt werden kann, wie im obigen Beispiel für die Zip-Datei.

Schließlich bestätigen nicht alle Server InputStream- Teile. Der Server, den wir in der ersten Zeile des Codes instanziiert haben, erkennt InputStreams .

Schauen wir uns nun ein anderes Beispiel an, in dem addBinaryBody direkt mit einem Byte-Array arbeitet:

Beispiel 3.3. - Hochladen eines Byte-Arrays und von Text

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

Beachten Sie den ContentType, der jetzt Binärdaten angibt.

4. Fazit

In diesem Artikel wurde der MultipartEntityBuilder als flexibles Objekt vorgestellt, das mehrere API-Optionen zum Erstellen eines mehrteiligen Formulars bietet.

Die Beispiele haben auch gezeigt, wie Sie mit dem HttpClient eine HttpEntity hochladen, die einer Formularentität ähnelt.

Die Implementierung all dieser Beispiele und Codefragmente finden Sie in unserem GitHub-Projekt - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.