Flerdelt opplasting med HttpClient 4

1. Oversikt

I denne opplæringen vil vi illustrere hvordan du gjør det en opplasting med flere deler ved hjelp av HttpClient 4.

Vi bruker //echo.200please.com som testserver fordi den er offentlig og den godtar de fleste typer innhold.

Hvis du vil grave dypere og lære andre kule ting du kan gjøre med HttpClient - gå videre til HttpClient-hovedveiledningen.

2. Bruke AddPart Metode

La oss starte med å se på MultipartEntityBuilder ha innvendinger legge til deler til en Http-enhet som deretter lastes opp via en POST-operasjon.

Dette er en generisk metode for å legge til deler til en HttpEntity som representerer skjemaet.

Eksempel 2.1. - Laste opp et skjema med to tekstdeler og en fil

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

Merk at vi instantierer Fil objektet ved også å spesifisere Innholdstype verdi som skal brukes av serveren.

Vær også oppmerksom på at addPart metoden har to argumenter, som fungerer som nøkkel / verdi par for skjemaet. Disse er bare relevante hvis serversiden faktisk forventer og bruker parameternavn - ellers blir de rett og slett ignorert.

3. Bruke addBinaryBody og addTextBody Metoder

En mer direkte måte å opprette en flerdelt enhet på er å bruke addBinaryBody og AddTextBody metoder. Disse metodene fungerer for å laste opp tekst, filer, tegnmatriser og InputStream gjenstander. La oss illustrere hvordan med enkle eksempler.

Eksempel 3.1. - Laste opp tekst og en tekstfildel

HttpPost post = new HttpPost ("// echo.200please.com"); Filfil = ny fil (textFileName); Strengmelding = "Dette er et flerdelt innlegg"; MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", file, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody ("tekst", melding, ContentType.DEFAULT_BINARY); // HttpEntity entity = builder.build (); post.setEntity (enhet); HttpResponse respons = client.execute (post);

Merk at FileBody og StringBody her er det ikke behov for gjenstander.

Også viktig, de fleste servere sjekker ikke Innholdstype av tekstens brødtekst, slik at addTextBody metoden kan utelate Innholdstype verdi.

De addBinaryBody API godtar a Innholdstype - men det er også mulig å opprette enheten bare fra en binær kropp og navnet på skjema-parameteren som inneholder filen. Som nevnt i forrige avsnitt, vil noen servere ikke gjenkjenne filen hvis Innholdstype verdi er ikke spesifisert.

Deretter legger vi til en zip-fil som en InputStream, mens bildefilen legges til som Fil gjenstand:

Eksempel 3.2. - Laster opp enZip File, en bildefil og en tekstdel

HttpPost post = new HttpPost ("// echo.200please.com"); InputStream inputStream = ny FileInputStream (zipFileName); Filfil = ny fil (imageFileName); Strengmelding = "Dette er et flerdelt innlegg"; MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", file, ContentType.DEFAULT_BINARY, imageFileName); builder.addBinaryBody ("oppstrøms", inputStream, ContentType.create ("applikasjon / zip"), zipFileName); builder.addTextBody ("tekst", melding, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build (); post.setEntity (enhet); HttpResponse respons = client.execute (post);

Merk at Innholdstype verdi kan opprettes på farten, slik tilfellet er i eksemplet ovenfor for zip-filen.

Til slutt erkjenner ikke alle servere InputStream deler. Serveren vi instantierte i første linje i koden gjenkjenner InputStreams.

La oss nå se på et annet eksempel der addBinaryBody jobber direkte med et byte-utvalg:

Eksempel 3.3. - Laste opp en byteoppstilling og tekst

HttpPost post = new HttpPost ("// echo.200please.com"); Strengmelding = "Dette er et innlegg i flere deler"; 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", melding, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build (); post.setEntity (enhet); HttpResponse respons = client.execute (post);

Legg merke til Innholdstype - som nå spesifiserer binære data.

4. Konklusjon

Denne artikkelen har presentert MultipartEntityBuilder som et fleksibelt objekt som tilbyr flere API-valg for å lage et flerdelt skjema.

Eksemplene har også vist hvordan du bruker HttpClient å laste opp en HttpEntity som ligner på en skjemaenhet.

Implementeringen av alle disse eksemplene og kodebiter kan du finne i GitHub-prosjektet vårt - dette er et formørkelsesbasert prosjekt, så det skal være enkelt å importere og kjøre som det er.


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