package Ġcom . ring ov Ċ Ċ import Ġcom . ring ov . data . Url Ċ import Ġcom . ring ov . data . Url Repository Ċ import Ġorg . springframework . core . io . FileSystem Resource Ċ import Ġorg . springframework . http .* Ċ import Ġorg . springframework . util . Linked Multi Value Map Ċ import Ġorg . springframework . util . Multi Value Map Ċ import Ġorg . springframework . web . bind . annotation . RequestMapping Ċ import Ġorg . springframework . web . bind . annotation . Request Method Ċ import Ġorg . springframework . web . bind . annotation . RequestParam Ċ import Ġorg . springframework . web . bind . annotation . RestController Ċ import Ġorg . springframework . web . multipart . Multipart File Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġorg . springframework . util . StringUtils . clean Path Ċ import Ġorg . springframework . web . client . Rest Template Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . Exception Ċ Ċ @ RestController Ċ class ĠFile Upload Controller ( private Ġval Ġurl Repository : ĠUrl Repository ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFILE _ STORE _ URL Ġ= Ġ" https :// api . anonymous files . io /" ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠOUTPUT _ STORE _ URL Ġ= Ġ" https :// anonymous files . io / f /" ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTMP _ FILE _ DIR : ĠString Ġ= ĠSystem . getProperty (" java . io . tmpdir ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġimage Modifier Ġ= ĠImage Modifier () ĊĊĠĠĠ Ġ@ RequestMapping ( value Ġ= Ġ"/ upload ", Ġmethod Ġ= ĠarrayOf ( Request Method . POST ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsume s Ġ= ĠarrayOf ( MediaType . MULTI PART _ FORM _ DATA _ VALUE )) ĊĠĠĠ Ġfun Ġupload File (@ RequestParam (" file ") Ġfile : ĠMultip art File ): ĠResponseEntity < String > Ġ{ ĊĠĠĠĠĠĠĠ ĠLogger . log ( file . original Filename Ġ+ Ġ" Ġ" Ġ+ Ġfile . contentType Ġ+ Ġ", Ġ" Ġ+ Ġfile . name ) ĊĊĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġget Extension ( file . original Filename ) ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġgenerate Name () Ġ+ Ġextension ĊĠĠĠĠĠĠĠ Ġval Ġinitial Tmp File Ġ= Ġmultipart ToFile ( file , ĠfileName ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmodified Image Ġ= Ġimage Modifier . modify ( initial Tmp File ) ĊĠĠĠĠĠĠĠ Ġval Ġmodified Image File Ġ= Ġprepare Tmp File ( generate Name () Ġ+ Ġextension ) ĊĊĠĠĠĠĠĠĠ Ġmodified Image . write ToFile ( modified Image File ) ĊĠĠĠĠĠĠĠ Ġinitial Tmp File . delete () ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġbuild File Request ( modified Image File ) ĊĠĠĠĠĠĠĠ Ġmodified Image File . delete () ĊĊĠĠĠĠĠĠĠ ĠLogger . log (" Initial Ġtmp Ġfile Ġremoved : Ġ${ ! initial Tmp File . exists () }") ĊĠĠĠĠĠĠĠ ĠLogger . log (" Modified Ġtmp Ġfile Ġremoved : Ġ${ ! modified Image File . exists () }") ĊĊĠĠĠĠĠĠĠ ĠLogger . log ( response . toString ()) ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġbuild Response ( modified Image File . name ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġurl Repository . save ( Url ( url Ġ= Ġurl )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity ( url , ĠHttpStatus . OK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class , ĠIOException :: class ) ĊĠĠĠ Ġfun Ġmultipart ToFile ( multipart : ĠMultip art File , ĠfileName : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconvert File Ġ= Ġprepare Tmp File ( fileName ) ĊĠĠĠĠĠĠĠ Ġmultipart . transfer To ( convert File ) ĊĊĠĠĠĠĠĠĠ ĠLogger . log (" Tmp Ġfile Ġcreated : Ġ${ convert File . exists () }") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconvert File ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Extension ( fileName : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġclean Path ( fileName ) ĊĠĠĠĠĠĠĠ Ġval Ġdot Index Ġ= Ġfilename . lastIndexOf (".") ĊĠĠĠĠĠĠĠ Ġreturn Ġfilename . sub Sequence ( dot Index , Ġfilename . length ). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprepare Tmp File ( name : ĠString ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( TMP _ FILE _ DIR , Ġname ) ĊĠĠĠĠĠĠĠ Ġval Ġcreated Ġ= Ġfile . createNew File () ĊĠĠĠĠĠĠĠ ĠLogger . log (" File Ġ${ file . name } Ġcreated : Ġ$ created ") ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Name (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠUUID . randomUUID (). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild File Request ( file : ĠFile ): ĠResponseEntity < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġheaders Ġ= ĠHttp Headers () ĊĠĠĠĠĠĠĠ Ġheaders . contentType Ġ= ĠMediaType . MULTI PART _ FORM _ DATA ĊĊĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠLinked Multi Value Map < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġbody . add (" file ", ĠFileSystem Resource ( file )) ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Entity Ġ= ĠHttp Entity < Multi Value Map < String , ĠAny >>( body , Ġheaders ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrest Template Ġ= ĠRest Template () ĊĠĠĠĠĠĠĠ Ġreturn Ġrest Template . post For Entity < String >( FILE _ STORE _ URL , Ġrequest Entity , ĠString :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild Response ( fileName : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠOUTPUT _ STORE _ URL Ġ+ ĠfileName ĊĠĠĠ Ġ} Ċ }