package Ġio . github . mond hs . pol i ep a . helper Ċ Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . io . OutputStream Ċ import Ġjava . io . OutputStream Writer Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . URL ĊĊĊĊ Ċ class ĠMultip art Ċ /** Ċ Ġ* ĠThis Ġconstructor Ġinitializes Ġa Ġnew ĠHTTP ĠPOST Ġrequest Ġwith Ġcontent Ġtype Ċ Ġ* Ġis Ġset Ġto Ġmultipart / form - data Ċ Ġ* Ġ@ param Ġurl Ċ Ġ* Ġ* Ċ Ġ* Ġ@ throws ĠIOException Ċ Ġ*/ Ċ @ Throws ( IOException :: class ) Ċ constructor ( url : ĠURL ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLINE _ FEED Ġ= Ġ"\ r \ n " ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmax BufferSize Ġ= Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcharset Ġ= Ġ" UTF - 8 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġcreates Ġa Ġunique Ġboundary Ġbased Ġon Ġtime Ġstamp ĊĠĠĠ Ġprivate Ġval Ġboundary : ĠString Ġ= Ġ" == =" Ġ+ ĠSystem . currentTimeMillis () Ġ+ Ġ" == =" ĊĠĠĠ Ġprivate Ġval Ġhttp Connection : ĠHttp URLConnection Ġ= Ġurl . open Connection () Ġas ĠHttp URLConnection ĊĠĠĠ Ġprivate Ġval ĠoutputStream : ĠOutputStream ĊĠĠĠ Ġprivate Ġval Ġwriter : ĠPrintWriter ĊĊĠĠĠ Ġinit Ġ{ ĊĊĠĠĠĠĠĠĠ Ġhttp Connection . setRequest Property (" Accept - Charset ", Ġ" UTF - 8 ") ĊĠĠĠĠĠĠĠ Ġhttp Connection . setRequest Property (" Connection ", Ġ" Keep - Alive ") ĊĠĠĠĠĠĠĠ Ġhttp Connection . setRequest Property (" Cache - Control ", Ġ" no - cache ") ĊĠĠĠĠĠĠĠ Ġhttp Connection . setRequest Property (" Content - Type ", Ġ" multipart / form - data ; Ġboundary =" Ġ+ Ġboundary ) ĊĠĠĠĠĠĠĠ Ġhttp Connection . set Chunk ed Streaming Mode ( max BufferSize ) ĊĠĠĠĠĠĠĠ Ġhttp Connection . do Input Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġhttp Connection . do Output Ġ= Ġtrue ĠĠĠ Ġ// Ġindicates ĠPOST Ġmethod ĊĠĠĠĠĠĠĠ Ġhttp Connection . use Caches Ġ= Ġfalse ĊĠĠĠĠĠĠĠ ĠoutputStream Ġ= Ġhttp Connection . output Stream ĊĠĠĠĠĠĠĠ Ġwriter Ġ= ĠPrintWriter ( OutputStream Writer ( output Stream , Ġcharset ), Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġform Ġfield Ġto Ġthe Ġrequest ĊĠĠĠĠ Ġ* Ġ@ param Ġname Ġ Ġfield Ġname ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġfield Ġvalue ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd FormField ( name : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . append ("-- "). append ( boundary ). append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . append (" Content - Disposition : Ġform - data ; Ġname =\"" ). append ( name ). append ("\" ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . append ( value ). append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . flush () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġupload Ġfile Ġsection Ġto Ġthe Ġrequest ĊĠĠĠĠ Ġ* Ġ@ param ĠfieldName Ġ Ġ- Ġname Ġattribute Ġin Ġ< input Ġtype =" file " Ġname =" ... "></ input > ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġupload File Ġ- Ġa ĠFile Ġto Ġbe Ġuploaded ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġadd File Part ( fieldName : ĠString , Ġupload File : ĠFile , ĠfileName : ĠString , ĠfileType : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . append ("-- "). append ( boundary ). append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . append (" Content - Disposition : Ġfile ; Ġname =\"" ). append ( fieldName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("\ "; Ġfilename =\"" ). append ( fileName ). append ("\ "" ). append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . append (" Content - Type : Ġ"). append ( fileType ). append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . flush () ĊĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĠFileInputStream ( upload File ) ĊĠĠĠĠĠĠĠ ĠinputStream . copy To ( output Stream , Ġmax BufferSize ) ĊĊĠĠĠĠĠĠĠ ĠoutputStream . flush () ĊĠĠĠĠĠĠĠ ĠinputStream . close () ĊĠĠĠĠĠĠĠ Ġwriter . append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . flush () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġadd File Fl ac Part ( fieldName : ĠString , Ġupload File : ĠFile , ĠfileName : ĠString , ĠfileType : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . append ("-- "). append ( boundary ). append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . append (" Content - Disposition : Ġfile ; Ġname =\"" ). append ( fieldName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ("\ "; Ġfilename =\"" ). append ( fileName ). append ("\ "" ). append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . append (" Content - Type : Ġ"). append ( fileType ). append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . flush () ĊĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĠFileInputStream ( upload File ) ĊĊĠĠĠĠĠĠĠ ĠinputStream . copy To ( output Stream , Ġmax BufferSize ) ĊĊĠĠĠĠĠĠĠ ĠoutputStream . flush () ĊĠĠĠĠĠĠĠ ĠinputStream . close () ĊĠĠĠĠĠĠĠ Ġwriter . append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . flush () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġheader Ġfield Ġto Ġthe Ġrequest . ĊĠĠĠĠ Ġ* Ġ@ param Ġname Ġ Ġ- Ġname Ġof Ġthe Ġheader Ġfield ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġvalue Ġ- Ġvalue Ġof Ġthe Ġheader Ġfield ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd Header Field ( name : ĠString , Ġvalue : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . append ( name Ġ+ Ġ": Ġ" Ġ+ Ġvalue ). append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . flush () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠUpload Ġthe Ġfile Ġand Ġreceive Ġa Ġresponse Ġfrom Ġthe Ġserver . ĊĠĠĠĠ Ġ* Ġ@ param Ġon File Uploaded Listener ĊĠĠĠĠ Ġ* Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġupload ( on Success : Ġ( String ) Ġ-> ĠUnit , Ġon Failure : Ġ(( Int ) Ġ-> ĠUnit )? Ġ= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwriter . append ( LINE _ FEED ). flush () ĊĠĠĠĠĠĠĠ Ġwriter . append ("-- "). append ( boundary ). append ("-- ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. append ( LINE _ FEED ) ĊĠĠĠĠĠĠĠ Ġwriter . close () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchecks Ġserver 's Ġstatus Ġcode Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġhttp Connection . response Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ== ĠHttp URLConnection . HTTP _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠBufferedReader ( InputStream Reader ( http Connection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. inputStream )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġreader . use ( BufferedReader :: read Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttp Connection . disconnect () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonSuccess ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ?. invoke ( status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }