Meerdelige upload met HttpClient 4

1. Overzicht

In deze tutorial laten we zien hoe je dat moet doen een meerdelige uploadbewerking met behulp van HttpClient 4.

We zullen gebruiken //echo.200please.com als testserver omdat deze openbaar is en de meeste soorten inhoud accepteert.

Als je dieper wilt graven en leer andere coole dingen die u kunt doen met de HttpClient - ga naar de hoofdhandleiding van HttpClient.

2. Gebruik de AddPart Methode

Laten we beginnen met het bekijken van de MultipartEntityBuilder bezwaar maken tegen onderdelen toevoegen aan een Http-entiteit die vervolgens worden geüpload via een POST-bewerking.

Dit is een algemene methode om onderdelen toe te voegen aan een HttpEntity die het formulier vertegenwoordigen.

Voorbeeld 2.1. - Een formulier met twee tekstdelen en een bestand uploaden

Bestandsbestand = nieuw bestand (textFileName); HttpPost post = nieuwe HttpPost ("// echo.200please.com"); FileBody fileBody = nieuwe FileBody (bestand, ContentType.DEFAULT_BINARY); StringBody stringBody1 = nieuwe StringBody ("Bericht 1", ContentType.MULTIPART_FORM_DATA); StringBody stringBody2 = nieuwe StringBody ("Bericht 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 entiteit = builder.build (); // post.setEntity (entiteit); HttpResponse response = client.execute (plaatsen);

Merk op dat we het het dossier object door ook het ContentType waarde die door de server moet worden gebruikt.

Merk ook op dat het addPart methode heeft twee argumenten, die zich gedragen als sleutel waarde paren voor het formulier. Deze zijn alleen relevant als de server-side daadwerkelijk parameternamen verwacht en gebruikt - anders worden ze gewoon genegeerd.

3. Gebruik de addBinaryBody en addTextBody Methoden

Een directere manier om een ​​uit meerdere delen bestaande entiteit te maken, is door de addBinaryBody en AddTextBody methoden. Deze methoden werken voor het uploaden van tekst, bestanden, tekenarrays en InputStream voorwerpen. Laten we illustreren hoe met eenvoudige voorbeelden.

Voorbeeld 3.1. - Uploaden van tekst en een tekstbestanddeel

HttpPost post = nieuwe HttpPost ("// echo.200please.com"); Bestandsbestand = nieuw bestand (textFileName); String message = "Dit is een meerdelige post"; MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", bestand, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody ("tekst", bericht, ContentType.DEFAULT_BINARY); // HttpEntity entity = builder.build (); post.setEntity (entiteit); HttpResponse response = client.execute (plaatsen);

Merk op dat de FileBody en StringBody objecten zijn hier niet nodig.

Ook belangrijk is dat de meeste servers de ContentType van de tekst, dus de addTextBody methode kan de ContentType waarde.

De addBinaryBody API accepteert een ContentType - maar het is ook mogelijk om de entiteit alleen te maken vanuit een binaire body en de naam van de formulierparameter die het bestand bevat. Zoals vermeld in het vorige gedeelte, zullen sommige servers het bestand niet herkennen als het ContentType waarde is niet gespecificeerd.

Vervolgens voegen we een zip-bestand toe als een InputStream, terwijl het afbeeldingsbestand wordt toegevoegd als het dossier voorwerp:

Voorbeeld 3.2. - Uploaden van eenZip-bestand, een afbeeldingsbestand en een tekstgedeelte

HttpPost post = nieuwe HttpPost ("// echo.200please.com"); InputStream inputStream = nieuwe FileInputStream (zipFileName); Bestandsbestand = nieuw bestand (imageFileName); String message = "Dit is een post uit meerdere delen"; MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", bestand, ContentType.DEFAULT_BINARY, imageFileName); builder.addBinaryBody ("stroomopwaarts", inputStream, ContentType.create ("applicatie / zip"), zipFileName); builder.addTextBody ("tekst", bericht, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build (); post.setEntity (entiteit); HttpResponse response = client.execute (plaatsen);

Merk op dat de ContentType waarde kan on-the-fly worden gecreëerd, zoals het geval is in het bovenstaande voorbeeld voor het zip-bestand.

Ten slotte erkennen niet alle servers InputStream onderdelen. De server die we in de eerste regel van de code hebben geïnstantieerd, herkent InputStreams.

Laten we nu naar een ander voorbeeld kijken waar addBinaryBody werkt rechtstreeks met een byte-array:

Voorbeeld 3.3. - Een byte-array en tekst uploaden

HttpPost post = nieuwe HttpPost ("// echo.200please.com"); String message = "Dit is een bericht uit meerdere delen"; byte [] bytes = "binaire code" .getBytes (); // MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody ("tekst", bericht, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build (); post.setEntity (entiteit); HttpResponse response = client.execute (plaatsen);

Let op de ContentType - die nu binaire gegevens specificeert.

4. Conclusie

Dit artikel heeft het MultipartEntityBuilder als een flexibel object dat meerdere API-keuzes biedt om een ​​meerdelig formulier te maken.

De voorbeelden hebben ook laten zien hoe u de HttpClient uploaden een HttpEntity die vergelijkbaar is met een formulierentiteit.

De implementatie van al deze voorbeelden en codefragmenten is te vinden in ons GitHub-project - dit is een op Eclipse gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.