From fe1d5fccd31aa1b2f50bfb31766227f91145755c Mon Sep 17 00:00:00 2001 From: leebj Date: Thu, 5 Sep 2024 11:08:33 +0900 Subject: [PATCH] =?UTF-8?q?=EB=8B=A8=EC=86=8D=EC=82=AC=EC=A7=84=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=20=EC=9D=B4=EB=8F=99(FileControl?= =?UTF-8?q?ler=20->=20Crdn06Controller)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xit/fims/base/web/FileController.java | 246 ++++++++++++++++++ .../resources/sql/mapper/base/file-mapper.xml | 184 +++++++++++++ 2 files changed, 430 insertions(+) create mode 100644 src/main/java/cokr/xit/fims/base/web/FileController.java create mode 100644 src/main/resources/sql/mapper/base/file-mapper.xml diff --git a/src/main/java/cokr/xit/fims/base/web/FileController.java b/src/main/java/cokr/xit/fims/base/web/FileController.java new file mode 100644 index 00000000..6dce12e7 --- /dev/null +++ b/src/main/java/cokr/xit/fims/base/web/FileController.java @@ -0,0 +1,246 @@ +package cokr.xit.fims.base.web; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.StringWriter; +import java.net.URISyntaxException; +import java.net.URLDecoder; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.function.Consumer; +import java.util.regex.Matcher; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.apache.commons.io.FilenameUtils; +import org.apache.poi.xslf.usermodel.XMLSlideShow; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.ModelAndView; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import cokr.xit.base.file.dao.FileMapper; +import cokr.xit.base.file.service.FileQuery; +import cokr.xit.base.file.service.bean.FileBean; +import cokr.xit.foundation.Downloadable; +import cokr.xit.foundation.data.DataObject; + +@Controller +public class FileController extends cokr.xit.base.file.web.FileController { + @Resource(name = "fileMapper") + private FileMapper fileMapper; + + @Resource(name="fileBean") + private FileBean fileBean; + + + + @Override + public ModelAndView getFileList(FileQuery req) { + ModelAndView mav = new ModelAndView("jsonView"); + + //파일 목록 + List fileInfoList = fileService().getFileList(req); + + mav = setPagingInfo(mav, fileInfoList, "file"); + + return mav; + } + + + /** 메뉴얼을 다운로드한다. + * @return 메뉴얼 파일 + * @throws Exception + */ + @GetMapping(name = "메뉴얼 다운로드", value = "/downloadMenual.do") + public ModelAndView downloadMenual() throws Exception { + ModelAndView mav = new ModelAndView("downloadView"); + + String filePath = ("menual/메뉴얼.pptx"); + ClassPathResource cps = new ClassPathResource(filePath); + String menualVersion = ""; + try (XMLSlideShow slideShow = new XMLSlideShow(cps.getInputStream())) { + menualVersion = slideShow + .getProperties() + .getCoreProperties() + .getUnderlyingProperties() + .getVersionProperty() + .get(); + } + + InputStream menualIS = cps.getInputStream(); + byte[] menualBytes = menualIS.readAllBytes(); + menualIS.close(); + + Consumer writer = new Consumer() { + @Override + public void accept(OutputStream os) { + try { + os.write(menualBytes); + } catch (IOException e) { + e.printStackTrace(); + } + } + }; + + mav.addObject("download", + new Downloadable() + .setContentType("application/vnd.openxmlformats-officedocument.presentationml.presentation") + .setWriter(writer) + .setFilename("과태료통합관리시스템_메뉴얼"+"("+"v"+menualVersion+")"+".pptx") + ); + + return mav; + } + + + @GetMapping(name = "SVG 이미지 파일 색상 변경", value = "/modifySvg/**") + public void modifySvg(HttpServletRequest request, HttpServletResponse response) throws URISyntaxException, IOException, ParserConfigurationException, SAXException { + String requestURI = request.getRequestURI().toString(); + + String filepath = requestURI.split("modifySvg")[1]; + filepath = URLDecoder.decode(filepath, "UTF-8"); + filepath = filepath.replaceAll("/", Matcher.quoteReplacement(File.separator)); + filepath = "svg" + filepath; + + ClassPathResource resource = new ClassPathResource(filepath); + InputStream is = resource.getInputStream(); + + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder documentBuilder = factory.newDocumentBuilder(); + Document document = documentBuilder.parse(is); + Element root = document.getDocumentElement(); + NodeList nodeList = root.getChildNodes(); + + try { + String modify = request.getParameter("modify"); + if(modify == null || modify.equals("")){ + + } else if(modify.equals("active")){ + updateTagFillColor(nodeList, "green"); + } else if(modify.equals("alert")){ + updateTagFillColor(nodeList, "red"); + } + + String str4 = DocumentToString(document); + byte[] bytes = str4.getBytes(); + + response.setHeader(HttpHeaders.ACCEPT_RANGES, "bytes"); + response.setHeader(HttpHeaders.CONTENT_TYPE, "image/svg+xml"); + response.setHeader(HttpHeaders.CONNECTION, "keep-alive"); + response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true"); + response.setHeader("Pragma", "no-cache"); + response.setHeader(HttpHeaders.CACHE_CONTROL, "no-cache, must-revalidate"); + response.setDateHeader(HttpHeaders.EXPIRES, 0); + response.setHeader(HttpHeaders.CONTENT_LENGTH, Integer.toString(bytes.length)); + response.setContentType("image/svg+xml"); + + OutputStream os = response.getOutputStream(); + os.write(bytes); + os.flush(); + os.close(); + + + } catch (Exception e){ + + } + + + } + + + + public static String DocumentToString( Document doc ) + { + try + { + StringWriter clsOutput = new StringWriter( ); + Transformer clsTrans = TransformerFactory.newInstance( ).newTransformer( ); + + clsTrans.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "no" ); + clsTrans.setOutputProperty( OutputKeys.METHOD, "xml" ); + clsTrans.setOutputProperty( OutputKeys.INDENT, "yes" ); + clsTrans.setOutputProperty( OutputKeys.ENCODING, "UTF-8" ); + + clsTrans.transform( new DOMSource( doc ), new StreamResult( clsOutput ) ); + + return clsOutput.toString( ); + } + catch( Exception ex ) + { + return ""; + } + } + + private void updateTagFillColor(NodeList nodeList, String newFillColor) { + + for (int i = 0; i < nodeList.getLength(); i++) { + Node node = nodeList.item(i); + NamedNodeMap namedNodeMap = node.getAttributes(); + if(namedNodeMap != null && namedNodeMap.getLength() > 0){ + for (int j = 0; j < namedNodeMap.getLength(); j++) { + Node namedNode = namedNodeMap.item(j); + if (namedNode.getNodeName().equalsIgnoreCase("fill")) { + namedNode.setNodeValue(newFillColor); // Change the color of the fill attribute. + } + } + } + } + } + + + @PostMapping(name = "처리 전 파일업로드", value = "/uploadBeforeProcess.do") + public ModelAndView uploadBeforeProcess(MultipartFile[] uploadFiles) { + ModelAndView mav = new ModelAndView("jsonView"); + + boolean saved = false; + + MultipartFile uploadFile = uploadFiles[0]; + String orginalFileName = uploadFile.getOriginalFilename(); + String extension = FilenameUtils.getExtension(orginalFileName); + + SimpleDateFormat ymdhmsFormat = new SimpleDateFormat("yyyyMMddHHmmss"); + String currentTime = ymdhmsFormat.format(new Date()); + + String folderPath = "files/temp/uploadFirst"; + File folder = new File(folderPath); + folder.mkdirs(); + String filePath = folderPath + "/"+currentTime+"."+extension; + File file = new File(filePath); + + + try { + uploadFile.transferTo(file); + saved = true; + } catch (IOException e) { + throw new RuntimeException("파일업로드 오류"+e); + } + + mav.addObject("saved", saved); + mav.addObject("filePath", filePath); + return mav; + } + +} \ No newline at end of file diff --git a/src/main/resources/sql/mapper/base/file-mapper.xml b/src/main/resources/sql/mapper/base/file-mapper.xml new file mode 100644 index 00000000..5a564e37 --- /dev/null +++ b/src/main/resources/sql/mapper/base/file-mapper.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + +CONCAT('files/', DIR, DATE_FORMAT(CURRENT_DATE, '/%Y/%m/%d/')) +FILE_PATH + + +SELECT INF_TYPE + , DIR + FROM ( + SELECT '010' INF_TYPE, 'interface/attachment/smg' DIR UNION + SELECT '020' INF_TYPE, 'interface/attachment/saeol' DIR UNION + SELECT '030' INF_TYPE, 'interface/attachment/epost' DIR UNION + + SELECT '100' INF_TYPE, 'attachment/violation' DIR UNION + SELECT '110' INF_TYPE, 'attachment/opinion' DIR UNION + SELECT '120' INF_TYPE, 'attachment/rent' DIR UNION + SELECT '190' INF_TYPE, 'attachment/capture' DIR + ) FILE_DIRS + + + + +SELECT A.FILE_ID + , A.INF_TYPE + , A.INF_KEY + , A.SUB_TYPE + , A.FILE_NM + , A.FILE_PATH + , A.MIME_TYPE + , A.FILE_SIZE + , A.DNLD_CNT + , A.SRT_ORD + , A.USE_YN + , A.REG_DT + , A.RGTR + , AS URL + FROM TB_FILE A + WHERE FILE_ID IN (#{fileID}) + ORDER BY FILE_ID + + + +SELECT A.FILE_ID + , A.INF_TYPE + , A.INF_KEY + , A.SUB_TYPE + , A.FILE_NM + , A.FILE_PATH + , A.MIME_TYPE + , A.FILE_SIZE + , A.DNLD_CNT + , A.SRT_ORD + , A.USE_YN + , A.REG_DT + , A.RGTR + , AS URL + FROM TB_FILE A + + AND A.INF_TYPE = #{infoType} + AND INF_KEY IN (#{infoKey}) + AND USE_YN = 'Y' + + + + + + + + + + + + + +/* 파일 등록(fileMapper.insertFile) */ + +SELECT NEW_ID + , CONCAT(DIR, NEW_ID, '.', #{file.extension}) PATH + FROM ( + SELECT NVL(MAX(FILE_ID) + 1, CONCAT(THIS_DAY, '00001')) NEW_ID + FROM () B + LEFT OUTER JOIN TB_FILE A ON FILE_ID LIKE CONCAT(THIS_DAY, '%') + ) T1 + , ( + + WHERE INF_TYPE = #{file.infoType} + ) T2 + +INSERT INTO TB_FILE ( + FILE_ID + , INF_TYPE + , INF_KEY + , SUB_TYPE + , FILE_NM + , FILE_PATH + , MIME_TYPE + , FILE_SIZE + , DNLD_CNT + , SRT_ORD + , RGTR + , REG_DT + , USE_YN +) VALUES ( + #{file.id} + , #{file.infoType} + , #{file.infoKey} + , #{file.subType} + , #{file.name} + , #{file.path} + , #{file.mimeType} + , #{file.size} + , #{file.downloadCount} + , #{file.sortOrder} + , #{currentUser.id} + , + , 'Y' +) + + + +/* 파일 순서 변경(fileMapper.reorder) */ +UPDATE TB_FILE + SET SRT_ORD = CASE FILE_ID + + WHEN #{fileID} THEN #{index} + + ELSE SRT_ORD END + WHERE FILE_ID IN (#{fileID}) + + + +/* 다운로드 횟수 증가(fileMapper.updateDownloadCount) */ +UPDATE TB_FILE SET + DNLD_CNT = DNLD_CNT + 1 + WHERE USE_YN = 'Y' + AND FILE_ID IN (#{fileID}) + + + +/* 파일 제거(fileMapper.removeFiles) */ +UPDATE TB_FILE + SET USE_YN = 'N' + WHERE USE_YN = 'Y' + AND FILE_ID IN (#{fileID}) + + AND INF_TYPE = #{infoType} + AND INF_KEY IN (#{infoKey}) + + +/* 파일 삭제(fileMapper.deleteFiles) */ +DELETE + FROM TB_FILE +WHERE FILE_ID IN (#{fileID}) + + + \ No newline at end of file