package Ġcn . it xia . api . service Ċ Ċ import Ġcn . it xia . api . model . Attachment Ċ import Ġcn . it xia . api . model . It xia Member Ċ import Ġcn . it xia . api . model . repository . Attachment Repository Ċ import Ġcn . it xia . api . response . Response Ċ import Ġcn . it xia . api . response . Response Code Ċ import Ġnet . co ob ird . thumbnail ator . Thumb nails Ċ import Ġorg . bson . types . ObjectId Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . beans . factory . annotation . Value Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . util . Digest Utils Ċ import Ġorg . springframework . web . multipart . Multipart File Ċ import Ġjava . io . File Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . IOException Ċ import Ġjava . net . URL Encoder Ċ import Ġjava . util .* Ċ import Ġjavax . servlet . http . HttpServletResponse Ċ Ċ /** Ċ Ġ* Ġ éĻĦ ä»¶ ä¸Ĭä¼ł çĽ¸åħ³ . Ċ Ġ* Ġ*/ Ċ @ Service Ċ class ĠAttachment Service Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĻĦ ä»¶ æĸĩä»¶ æĶ¾ ç½® çļĦ æł¹ çĽ®å½ķ . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġ@ Value ("\ ${ it xia . attachment . dir }") ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġroot Dir : ĠString ĊĊĠĠĠ Ġ@ Autowired ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġattachment Repository : ĠAttachment Repository ĊĊĠĠĠ Ġprivate Ġval Ġmax Thumbnail Size Ġ= Ġ 5 0 . 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¤ĦçĲĨ ä¸Ĭä¼ł æĸĩä»¶ . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġhandle Upload ( file : ĠMultip art File , Ġit xia Member : ĠI tx ia Member ?): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isEmpty Ġ|| Ġfile . original Filename Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResponse Code . FILE _ UPLOAD _ FAIL . with Payload (" éĻĦ ä»¶ ä¸įèĥ½ä¸ºç©º .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmd 5 Ġ= ĠDigest Utils . md 5 Digest As Hex ( file . bytes ) ĊĊĠĠĠĠĠĠĠ Ġval Ġattachment Ġ= ĠAttachment ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ id Ġ= ĠObjectId . get (). to HexString (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfileName Ġ= Ġfile . original Filename !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġfile . size , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmimeType Ġ= Ġfile . contentType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 Ġ= Ġmd 5 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload By Ġ= Ġit xia Member ?. to Base Info Only (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupload Time Ġ= ĠDate (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleted Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġsaved Result Ġ= Ġattachment Repository . save ( attachment ) ĊĠĠĠĠĠĠĠ Ġ// save Ġto Ġfile Ġsystem ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġ"${ rootDir }${ md 5 }" ĊĠĠĠĠĠĠĠ Ġval Ġdisk File Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! disk File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . transfer To ( disk File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠResponse Code . SUCCESS . with Payload ( saved Result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ æĸĩä»¶ . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun ĠgetFile (_ id : ĠString , Ġis Download : ĠBoolean , Ġis Thumbnail : ĠBoolean , Ġresponse : ĠHttpServletResponse ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġattachment Ġ= Ġattachment Repository . findBy _ id And Deleted False (_ id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġis Image Ġ= Ġattachment . mime Type ?. contains (" image ") Ġ?: Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Thumbnail Ġ&& Ġ! is Image ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// éĿŀ åĽ¾çīĩ ä¸į çĶŁæĪĲ ç¼© çķ¥ åĽ¾ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Download ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĬłåħ¥ ä¸ĭè½½ header . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoded FileName Ġ= ĠURL Encoder . encode ( attachment . fileName , Ġ" UTF - 8 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġ" attachment ; Ġfilename *= UTF - 8 '' ${ encoded FileName }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . setHeader (" Content - Disposition ", Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġresponse . contentType Ġ= Ġattachment . mime Type ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ("${ rootDir }${ attachment . md 5 }") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Image Ġ&& Ġis Thumbnail ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attachment . size Ġ> Ġ 1 0 0 Ġ* Ġ 1 0 2 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åıª ä¸º 1 0 0 KB ä»¥ ä¸ĬçļĦ åĽ¾çīĩ çĶŁæĪĲ ç¼© çķ¥ åĽ¾ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThumb nails . of ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. size ( 2 0 0 , Ġ 2 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Quality ( 0 . 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. keep AspectRatio ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to OutputStream ( response . output Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¿ĶåĽŀ åİŁ æĸĩä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Bytes Ġ= Ġfile . read Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . output Stream . write ( file Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( is Image Ġ&& Ġ! is Download Ġ&& Ġattachment . size Ġ> Ġ 1 0 0 Ġ* Ġ 1 0 2 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¤§äºİ 1 0 0 KB çļĦ åĽ¾çīĩ ï¼Į çĶŁæĪĲ çŃī å° º å¯ ¸ åİĭç¼© åĽ¾ ( ä¸įæĺ¯ ç¼© çķ¥ åĽ¾ ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThumb nails . of ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. scale ( 1 . 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. output Quality ( 0 . 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to OutputStream ( response . output Stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! is Image Ġ&& Ġ! is Download ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// do Ġnothing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¿ĶåĽŀ åİŁ æĸĩä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Bytes Ġ= Ġfile . read Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . output Stream . write ( file Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( file NotFoundException : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// TODO Ġlog Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status Ġ= Ġ 4 0 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io Exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . status Ġ= Ġ 5 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ çĶ± ObjectID èİ·åıĸ éĻĦ ä»¶ . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid List ĠObject ID åĪĹè¡¨ . ĊĠĠĠĠ Ġ* Ġ@ return Ġ éĻĦ ä»¶ åĪĹè¡¨ . ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġget Attachment List ByID List ( id List : ĠList < String >): ĠList < Attachment > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġattachment Repository . findAll By _ id In And Deleted False ( id List ). to Mutable List () ĊĠĠĠ Ġ} Ċ } Ċ