Multipart-upload med HttpClient 4

1. Oversigt

I denne vejledning illustrerer vi, hvordan du gør en upload af flere dele ved hjælp af HttpClient 4.

Vi bruger //echo.200please.com som testserver, fordi den er offentlig, og den accepterer de fleste typer indhold.

Hvis du vil grave dybere og lære andre seje ting, du kan gøre med HttpClient - gå videre til de vigtigste HttpClient tutorial.

2. Brug af Tilføj del Metode

Lad os starte med at se på MultipartEntityBuilder protesterer mod føje dele til en Http-enhed som derefter uploades via en POST-handling.

Dette er en generisk metode til at føje dele til en HttpEntity repræsenterer formularen.

Eksempel 2.1. - Uploade en formular med to tekstdele og en fil

Filfil = ny fil (textFileName); HttpPost post = ny HttpPost ("// echo.200please.com"); FileBody fileBody = ny FileBody (fil, ContentType.DEFAULT_BINARY); StringBody stringBody1 = ny StringBody ("Besked 1", ContentType.MULTIPART_FORM_DATA); StringBody stringBody2 = ny StringBody ("Besked 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-enhed = builder.build (); // post.setEntity (enhed); HttpResponse respons = client.execute (post);

Bemærk, at vi instantierer Fil objekt ved også at specificere Indholdstype værdi, der skal bruges af serveren.

Bemærk også, at addPart metoden har to argumenter, der fungerer som nøgle / værdi par til formularen. Disse er kun relevante, hvis serversiden faktisk forventer og bruger parameternavne - ellers ignoreres de simpelthen.

3. Brug af addBinaryBody og addTextBody Metoder

En mere direkte måde at oprette en flerdelt enhed på er at bruge addBinaryBody og AddTextBody metoder. Disse metoder fungerer til at uploade tekst, filer, tegnarrays og InputStream genstande. Lad os illustrere hvordan med enkle eksempler.

Eksempel 3.1. - Upload af tekst og en tekstfildel

HttpPost post = ny HttpPost ("// echo.200please.com"); Filfil = ny fil (textFileName); String message = "Dette er et indlæg i flere dele"; MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", fil, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody ("tekst", besked, ContentType.DEFAULT_BINARY); // HttpEntity-enhed = builder.build (); post.setEntity (enhed); HttpResponse respons = client.execute (post);

Bemærk, at FileBody og StringBody objekter er ikke nødvendige her.

Det er også vigtigt, at de fleste servere ikke kontrollerer Indholdstype af tekstens brødtekst, så den addTextBody metoden kan udelade Indholdstype værdi.

Det addBinaryBody API accepterer en Indholdstype - men det er også muligt at oprette enheden bare fra et binært organ og navnet på formularparameteren, der indeholder filen. Som nævnt i det foregående afsnit genkender nogle servere ikke filen, hvis Indholdstype værdi er ikke angivet.

Dernæst tilføjer vi en zip-fil som en InputStream, mens billedfilen tilføjes som Fil objekt:

Eksempel 3.2. - Uploader enZip-fil, en billedfil og en tekstdel

HttpPost post = ny HttpPost ("// echo.200please.com"); InputStream inputStream = ny FileInputStream (zipFileName); Filfil = ny fil (imageFileName); String message = "Dette er et indlæg i flere dele"; MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", fil, ContentType.DEFAULT_BINARY, imageFileName); builder.addBinaryBody ("upstream", inputStream, ContentType.create ("application / zip"), zipFileName); builder.addTextBody ("tekst", besked, ContentType.TEXT_PLAIN); // HttpEntity-enhed = builder.build (); post.setEntity (enhed); HttpResponse respons = client.execute (post);

Bemærk, at Indholdstype værdi kan oprettes i farten, som det er tilfældet i eksemplet ovenfor for zip-filen.

Endelig anerkender ikke alle servere InputStream dele. Den server, vi instantierede i den første linje i koden, genkender InputStreams.

Lad os nu se på et andet eksempel hvor addBinaryBody arbejder direkte med et byte-array:

Eksempel 3.3. - Uploade en byte-array og tekst

HttpPost post = ny HttpPost ("// echo.200please.com"); String message = "Dette er et indlæg i flere dele"; byte [] bytes = "binær kode" .getBytes (); // MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", bytes, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody ("tekst", besked, ContentType.TEXT_PLAIN); // HttpEntity-enhed = builder.build (); post.setEntity (enhed); HttpResponse respons = client.execute (post);

Læg mærke til Indholdstype - som nu specificerer binære data.

4. Konklusion

Denne artikel har præsenteret MultipartEntityBuilder som et fleksibelt objekt, der tilbyder flere API-valg for at oprette en formular med flere dele.

Eksemplerne har også vist, hvordan du bruger HttpClient at uploade en HttpEntity der ligner en formenhed.

Implementeringen af ​​alle disse eksempler og kodestykker kan findes i vores GitHub-projekt - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.


$config[zx-auto] not found$config[zx-overlay] not found