Viacdielne nahrávanie pomocou HttpClient 4

1. Prehľad

V tomto tutoriáli si ukážeme, ako na to operácia nahrávania viacerých častí pomocou HttpClient 4.

Použijeme //echo.200please.com ako testovací server, pretože je verejný a akceptuje väčšinu typov obsahu.

Ak chcete kopať hlbšie a naučte sa ďalšie super veci, ktoré môžete robiť s HttpClient - prejdite ďalej k hlavnému výukovému programu HttpClient.

2. Pomocou AddPart Metóda

Začnime pohľadom na MultipartEntityBuilder namietať proti pridať diely k entite Http ktoré sa potom nahrajú pomocou operácie POST.

Toto je všeobecná metóda pridávania častí k súboru HttpEntity predstavujúci formulár.

Príklad 2.1. - Načítanie formulára s dvoma textovými časťami a súborom

File file = new File (textFileName); HttpPost post = nový HttpPost ("// echo.200please.com"); FileBody fileBody = nový FileBody (súbor, ContentType.DEFAULT_BINARY); StringBody stringBody1 = nový StringBody ("Správa 1", ContentType.MULTIPART_FORM_DATA); StringBody stringBody2 = nový StringBody ("Správa 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 (príspevok);

Všimnite si, že vytvárame inštanciu Súbor objekt tiež špecifikovaním Druh obsahu hodnota, ktorú má server použiť.

Upozorňujeme tiež, že addPart metóda má dva argumenty, pôsobiace ako kľúč / hodnota páry pre formulár. Sú relevantné, iba ak strana servera skutočne očakáva a používa názvy parametrov - inak sú jednoducho ignorované.

3. Pomocou addBinaryBody a addTextBody Metódy

Viac priamym spôsobom na vytvorenie viacdielnej entity je použitie súboru addBinaryBody a AddTextBody metódy. Tieto metódy fungujú na nahrávanie textu, súborov, polí znakov a InputStream predmety. Poďme si to ilustrovať na jednoduchých príkladoch.

Príklad 3.1. - Načítava sa text a časť textového súboru

HttpPost post = nový HttpPost ("// echo.200please.com"); File file = new File (textFileName); String message = "Toto je viacdielny príspevok"; MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", file, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody ("text", správa, ContentType.DEFAULT_BINARY); // HttpEntity entity = builder.build (); post.setEntity (entita); HttpResponse response = client.execute (príspevok);

Všimnite si, že FileBody a StringBody predmety tu nie sú potrebné.

Je tiež dôležité, že väčšina serverov nekontroluje Druh obsahu textu, takže addTextBody metóda môže vynechať Druh obsahu hodnotu.

The addBinaryBody API akceptuje a Druh obsahu - ale to je tiež je možné vytvoriť entitu iba z binárneho tela a názvu parametra formulára, ktorý drží súbor. Ako je uvedené v predchádzajúcej časti, niektoré servery nerozpoznajú súbor, ak Druh obsahu hodnota nie je zadaná.

Ďalej pridáme súbor zip ako InputStream, zatiaľ čo obrazový súbor bude pridaný ako Súbor objekt:

Príklad 3.2. - Nahráva sa aSúbor ZIP, obrazový súbor a textová časť

HttpPost post = nový HttpPost ("// echo.200please.com"); InputStream inputStream = nový FileInputStream (zipFileName); File file = new File (imageFileName); String message = "Toto je viacdielny príspevok"; 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", správa, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build (); post.setEntity (entita); HttpResponse response = client.execute (príspevok);

Všimnite si, že Druh obsahu hodnotu je možné vytvoriť za chodu, ako je to v príklade vyššie pre súbor zip.

Nakoniec to nie všetky servery potvrdzujú InputStream časti. Server, ktorý sme vytvorili v prvom riadku kódu, rozpozná InputStreams.

Pozrime sa teraz na ďalší príklad, kde addBinaryBody pracuje priamo s bajtovým poľom:

Príklad 3.3. - Načítava sa bajtové pole a text

HttpPost post = nový HttpPost ("// echo.200please.com"); String message = "Toto je viacdielny príspevok"; byte [] bytes = "binárny kód" .getBytes (); // MultipartEntityBuilder builder = MultipartEntityBuilder.create (); builder.setMode (HttpMultipartMode.BROWSER_COMPATIBLE); builder.addBinaryBody ("upfile", bajty, ContentType.DEFAULT_BINARY, textFileName); builder.addTextBody ("text", správa, ContentType.TEXT_PLAIN); // HttpEntity entity = builder.build (); post.setEntity (entita); HttpResponse response = client.execute (príspevok);

Všimnite si Druh obsahu - ktorý teraz špecifikuje binárne údaje.

4. Záver

Tento článok predstavil MultipartEntityBuilder ako flexibilný objekt, ktorý ponúka viac možností API na vytvorenie viacdielneho formulára.

Príklady tiež ukázali, ako používať HttpClient nahrať HttpEntity že podobne ako entita formulára.

Implementácia všetkých týchto príkladov a útržkov kódu nájdete v našom projekte GitHub - toto je projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.