package Ġio . arch x . tx blog . web . controller Ċ Ċ import Ġio . arch x . tx blog . common . def . Code Def Ċ import Ġio . arch x . tx blog . common . getLogger Ċ import Ġio . arch x . tx blog . common . q ini u . K odo Ċ import Ġio . arch x . tx blog . common . web . Result Ċ import Ġio . arch x . tx blog . data . service . Draft Service Ċ import Ġio . arch x . tx blog . web . bean . Markdown Un Zip Ċ import Ġio . arch x . tx blog . web . bean . Markdown Zip Ċ import Ġio . swagger . annotations . Api Ċ import Ġio . swagger . annotations . Api Implicit Param Ċ import Ġio . swagger . annotations . ApiOperation Ċ import Ġorg . springframework . util . StringUtils Ċ import Ġorg . springframework . web . bind . annotation .* Ċ import Ġorg . springframework . web . multipart . Multipart File Ċ import Ġspring fox . documentation . annotations . Api Ignore Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . net . URL Encoder Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . util . zip . Zip OutputStream Ċ import Ġjavax . servlet . http . HttpServletResponse Ċ Ċ @ RestController Ċ @ RequestMapping (" markdown ") Ċ @ Api ( tags Ġ= Ġ[" Markdown Ġ æİ§åĪ¶åĻ¨ "]) Ċ class ĠMarkdown Controller ( ĊĠĠĠ Ġval Ġk odo : ĠK odo , ĊĠĠĠ Ġval Ġdraft Service : ĠDraft Service ) Ġ{ ĊĊĠĠĠ Ġval Ġlogger Ġ= Ġget Logger () ĊĊĠĠĠ Ġ@ PostMapping ("/ import ") ĊĠĠĠ Ġ@ ApiOperation (" å¯¼åħ¥ Markdown ", Ġnotes Ġ= Ġ" å¯¼åħ¥ zip æł¼å¼ı çļĦ èµĦæºĲ åİĭç¼© åĮħ ") ĊĠĠĠ Ġ@ Api Implicit Param (" èµĦæºĲ æĸĩä»¶ ", Ġname Ġ= Ġ" file ", Ġparam Type Ġ= Ġ" body ") ĊĠĠĠ Ġfun Ġimport (@ RequestParam (" file ") Ġfile : ĠMultip art File ): ĠResult < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcondition ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . code ( Code Def . MISSING _ PARAMETER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(" application / x - zip - compressed " Ġ!= Ġfile . contentType Ġ&& Ġ" application / zip " Ġ!= Ġfile . contentType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResult . code ( Code Def . UNSUPPORTED _ FILE _ FORMAT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġzip Ġ= ĠMarkdown Un Zip ( file . inputStream ) ĊĠĠĠĠĠĠĠ Ġ// ĠæĽ ¿ æį¢ æİī åĽ¾çīĩ ĊĠĠĠĠĠĠĠ Ġzip . replace Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv Ġ= Ġk odo . upload ( entry . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK V ( entry . key , Ġv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" upload Ġimage Ġerror Ġ[ Ġkey Ġ= Ġ'{} ', Ġerr Ġ= Ġ'{} '] Ġ", Ġentry . key , Ġex . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK V ( entry . key , Ġentry . key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmarkdown Ġ= Ġzip . markdown () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( StringUtils . has Text ( markdown )) ĠResult . ok ( markdown !! ) Ġelse ĠResult . code ( Code Def . INVALID _ CONTENT ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ GetMapping ("/ export /{ id }") ĊĠĠĠ Ġ@ ApiOperation (" å¯¼åĩº Markdown ", Ġnotes Ġ= Ġ" æł¹æį® æĸĩç«ł ID å¯¼åĩº Markdown æĸĩä»¶ ") ĊĠĠĠ Ġ@ Api Implicit Param (" èį ī ç¨ ¿ æĸĩç«ł ID ", Ġname Ġ= Ġ" id ", Ġparam Type Ġ= Ġ" path ") ĊĠĠĠ Ġfun Ġexport ( ĊĠĠĠĠĠĠĠ Ġ@ PathVariable (" id ") Ġid : ĠLong , ĊĠĠĠĠĠĠĠ Ġ@ Api Ignore Ġ@ Request Header (" User - Agent ") Ġua : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ Api Ignore Ġresponse : ĠHttpServletResponse ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdraft Ġ= Ġdraft Service . findById ( id ) Ġ?: Ġreturn Ġ" Draft Ġnot Ġfound " ĊĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġval Ġzip Ġ= ĠMarkdown Zip ( draft , ĠZip OutputStream ( out )) ĊĠĠĠĠĠĠĠ Ġ// Ġzip Ġ åİĭç¼© ĊĠĠĠĠĠĠĠ Ġzip . zip () ĊĠĠĠĠĠĠĠ Ġzip . flush () ĊĊĠĠĠĠĠĠĠ Ġvar Ġfilename Ġ= Ġdraft . title Ġ+ Ġ". zip " ĊĠĠĠĠĠĠĠ Ġif Ġ( filename . length Ġ> Ġ 1 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilename Ġ= Ġfilename . substring ( 0 , Ġ 1 7 ) Ġ+ Ġ". zip " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfilename Ġ= ĠURL Encoder . encode ( filename , Ġ" UTF - 8 ") ĊĠĠĠĠĠĠĠ Ġval Ġutf 8 Ġ= ĠCharset . forName (" UTF - 8 ") ĊĠĠĠĠĠĠĠ Ġval Ġiso Ġ= ĠCharset . forName (" ISO 8 8 5 9 - 1 ") ĊĊĠĠĠĠĠĠĠ Ġ// Ġ äº¤ ç»Ļ æ¡Ĩæŀ¶ åħ³éĹŃ ĊĠĠĠĠĠĠĠ Ġfilename Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġua . toLowerCase (). indexOf (" firefox ") Ġ> Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString ( filename . toByteArray ( utf 8 ), Ġiso ) Ġ// Ġfire fox æµıè§ĪåĻ¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġua . toUpperCase (). indexOf (" MSI E ") Ġ> Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURL Encoder . encode ( filename , Ġ" UTF - 8 ") // ĠIE æµıè§ĪåĻ¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġua . toUpperCase (). indexOf (" CH ROME ") Ġ> Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString ( filename . toByteArray ( utf 8 ), Ġiso )// Ġ è° · æŃĮ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString ( filename . toByteArray ( utf 8 ), Ġiso )// ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresponse . setHeader (" Content - Type ", Ġ" application / zip ; charset = utf - 8 "); ĊĠĠĠĠĠĠĠ Ġresponse . contentType Ġ= Ġ" application / zip "; ĊĠĠĠĠĠĠĠ Ġ// Ġ ä¸ĭè½½ æĸĩä»¶ èĥ½ æŃ£å¸¸ æĺ¾ç¤º ä¸Ńæĸĩ ĊĠĠĠĠĠĠĠ Ġresponse . setHeader (" Content - Disposition ", Ġ" attachment ; filename =$ filename "); ĊĊĠĠĠĠĠĠĠ Ġout . use Ġ{ Ġit Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġit . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġops Ġ= Ġresponse . output Stream ĊĠĠĠĠĠĠĠĠĠĠĠ Ġops . write ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġops . flush () Ġ// Ġ äº¤ ç»Ļ æ¡Ĩæŀ¶ åħ³éĹŃ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠK V < K , ĠV >( override Ġval Ġkey : ĠK , Ġoverride Ġval Ġvalue : ĠV ) Ġ: ĠMap . Entry < K , ĠV > Ċ }