package Ġat . w avy walk . simp ler . servlet Utils Ċ Ċ import Ġat . w avy walk . simp ler . assets management . Public Folder Config Ċ import Ġat . w avy walk . simp ler . dependency management . Simp ler Dependency Manager Ċ import Ġat . w avy walk . simp ler . router . Simp ler Servlet RequestContext Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . net . URI Ċ Ċ class ĠPrimitive File Server ( ĊĠĠĠĠĠĠĠ Ġval Ġroot Path Of Ser ved File : ĠString Ġ= ĠSimp ler Dependency Manager . provider . assets Path Provider . public Folder Config . path To Public Dir !! Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġserve File ( context : ĠSimp ler Servlet RequestContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar ĠfilePath Ġ= Ġ"${ rootPath Of Ser ved File }${ URI ( context . request . request URI ). normalize () }" ĊĠĠĠĠĠĠĠ Ġif Ġ( filePath . startsWith ("/ ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath Ġ= ĠfilePath . substring ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . response . send Error ( 4 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext . response . setHeader (" Content - Disposition ", Ġ" attachment ; filename =${ file . name }") ĊĊĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= Ġcontext . response . get OutputStream () ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= ĠFileInputStream ( file ) ĊĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 4 0 9 6 ) ĊĊĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= ĠinputStream . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . write ( buffer , Ġ 0 , Ġlength ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠinputStream . close () ĊĠĠĠĠĠĠĠ ĠoutputStream . flush () ĊĠĠĠ Ġ} ĊĊ Ċ }