From 3b0e65702a89ba45815b0c9bd643aaeec5145c3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B0=95=EC=84=9D=20=EC=B5=9C?= Date: Fri, 20 Jan 2023 16:53:36 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B2=AC=EB=AC=B8=20=EC=B2=A8=EB=B6=80?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=9D=BC=EA=B4=84=20=EB=8B=A4=EC=9A=B4?= =?UTF-8?q?=EB=A1=9C=EB=93=9C=20=EC=9E=91=EC=97=85=EC=A4=91.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/dbnt/faisp/config/BaseService.java | 2 + .../com/dbnt/faisp/config/FileController.java | 85 +++++- .../CounterIntelligenceController.java | 2 +- .../main/fpiMgt/affair/AffairController.java | 14 +- .../fpiMgt/affair/service/AffairService.java | 10 + src/main/resources/application-dev.properties | 2 + .../igActivities/fpiMgt/affair/affairMgt.js | 35 ++- .../igActivities/fpiMgt/affair/affairMgt.html | 3 +- .../fpiMgt/affair/affairViewModal.html | 244 +++++++++--------- 9 files changed, 265 insertions(+), 132 deletions(-) diff --git a/src/main/java/com/dbnt/faisp/config/BaseService.java b/src/main/java/com/dbnt/faisp/config/BaseService.java index de41848f..6aaccf65 100644 --- a/src/main/java/com/dbnt/faisp/config/BaseService.java +++ b/src/main/java/com/dbnt/faisp/config/BaseService.java @@ -54,6 +54,8 @@ public class BaseService { protected String monitoringPath; @Value("${file.dir.intelligenceNetwork}") protected String intelligenceNetworkPath; + @Value("${file.dir.affairTemp}") + protected String affairTempPath; protected String calculationSize(double fileSize){ String[] units = {"bytes", "KB", "MB", "GB", "TB", "PB"}; diff --git a/src/main/java/com/dbnt/faisp/config/FileController.java b/src/main/java/com/dbnt/faisp/config/FileController.java index 6c962878..945ddcf9 100644 --- a/src/main/java/com/dbnt/faisp/config/FileController.java +++ b/src/main/java/com/dbnt/faisp/config/FileController.java @@ -20,10 +20,9 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.FileCopyUtils; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; @@ -31,6 +30,14 @@ import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; @RestController @RequiredArgsConstructor @@ -118,6 +125,78 @@ public class FileController extends BaseService{ e.printStackTrace(); } } + + @PostMapping("/downloadAffairFiles") + public void downloadAffairFiles(HttpServletRequest request, + HttpServletResponse response, + @RequestParam(value="affairKeyList") List affairKeyList){ + List fileList = affairService.selectAffairFileList(affairKeyList); + List> fileInfoList = new ArrayList<>(); + for(FileInfo file: fileList){ + Map fileInfoMap = new HashMap<>(); + fileInfoMap.put("filePath", file.getSavePath()+File.separator+file.getConvNm()); + fileInfoMap.put("originalName", file.getOrigNm()+"."+file.getFileExtn()); + fileInfoList.add(fileInfoMap); + } + BufferedInputStream in = null; + BufferedOutputStream out = null; + + String zipFile = locationPath+affairTempPath; + File saveFolder = new File(zipFile); + + if (!saveFolder.exists() || saveFolder.isFile()) { + saveFolder.mkdirs(); + } + String downloadFileName = "견문보고서 첨부파일_"+ LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"))+".zip"; + zipFile += File.separator+downloadFileName; + try{ + setDisposition(zipFile, request, response); + // ZipOutputStream을 FileOutputStream 으로 감쌈 + FileOutputStream fout = new FileOutputStream(zipFile); + ZipOutputStream zout = new ZipOutputStream(fout); + for(Map fileMap: fileInfoList){ + //본래 파일명 유지, 경로제외 파일압축을 위해 new File로 + ZipEntry zipEntry = new ZipEntry(fileMap.get("originalName")); + zout.putNextEntry(zipEntry); + //경로포함 압축 + //zout.putNextEntry(new ZipEntry(sourceFiles.get(i))); + + FileInputStream fin = new FileInputStream(fileMap.get("filePath")); + byte[] buffer = new byte[1024]; + int length; + + // input file을 1024바이트로 읽음, zip stream에 읽은 바이트를 씀 + while((length = fin.read(buffer)) > 0){ + zout.write(buffer, 0, length); + } + + zout.closeEntry(); + fin.close(); + } + + zout.close(); + + response.setContentType("application/zip"); + response.addHeader("Content-Disposition", "attachment; filename=" + downloadFileName); + + in=new BufferedInputStream(new FileInputStream(zipFile)); + out=new BufferedOutputStream(response.getOutputStream()); + FileCopyUtils.copy(in, out); + out.flush(); + /*byte[] data=new byte[2048]; + int input=0; + + while((input=in.read(data))!=-1){ + out.write(data,0,input); + out.flush(); + }*/ + if(out!=null) out.close(); + if(in!=null) in.close(); + } catch(IOException e){ + e.printStackTrace(); + } + } + private FileInfo getFileInfo(String board, Integer parentKey, Integer fileSeq){ FileInfo downloadFile = null; switch (board){ diff --git a/src/main/java/com/dbnt/faisp/main/counterIntelligence/CounterIntelligenceController.java b/src/main/java/com/dbnt/faisp/main/counterIntelligence/CounterIntelligenceController.java index 0a1e2adb..f88ccb30 100644 --- a/src/main/java/com/dbnt/faisp/main/counterIntelligence/CounterIntelligenceController.java +++ b/src/main/java/com/dbnt/faisp/main/counterIntelligence/CounterIntelligenceController.java @@ -110,7 +110,7 @@ public class CounterIntelligenceController { if(ciWorkStatistics.getYear()==null){ ciWorkStatistics.setYear(LocalDateTime.now().getYear()); } - ModelAndView mav = new ModelAndView("/counterIntelligence/ciWork/ciWorkStatistics"); + ModelAndView mav = new ModelAndView("counterIntelligence/ciWork/ciWorkStatistics"); mav.addObject("yearList", ciService.selectCiWorkYearList()); mav.addObject("ciWorkStatisticsList", ciService.selectCiWorkStatisticsList(ciWorkStatistics)); mav.addObject("searchParams", ciWorkStatistics); diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/AffairController.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/AffairController.java index 4a00ecc6..aab98eec 100644 --- a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/AffairController.java +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/AffairController.java @@ -1,5 +1,6 @@ package com.dbnt.faisp.main.fpiMgt.affair; +import com.dbnt.faisp.config.FileInfo; import com.dbnt.faisp.main.authMgt.service.AuthMgtService; import com.dbnt.faisp.main.codeMgt.service.CodeMgtService; import com.dbnt.faisp.main.fpiMgt.affair.model.AffairBoard; @@ -13,12 +14,15 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.servlet.ModelAndView; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.io.*; import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; @RestController @RequiredArgsConstructor @@ -307,7 +311,7 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관 mav.addObject("searchParams", typeStatistics); return mav; } - + private List addTotalRow(List type, List typeList){ Map totalMap = new HashMap<>(); for(String t: type) { diff --git a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/service/AffairService.java b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/service/AffairService.java index d8250003..89bae287 100644 --- a/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/service/AffairService.java +++ b/src/main/java/com/dbnt/faisp/main/fpiMgt/affair/service/AffairService.java @@ -16,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -179,6 +180,15 @@ public class AffairService extends BaseService { // 견문보고 public FileInfo selectAffairFile(Integer parentKey, Integer fileSeq) { return affairFileRepository.findById(new AffairFile.AffairFileId(parentKey, fileSeq)).orElse(null); } + + public List selectAffairFileList(List affairKeyList) { + List fileList = new ArrayList<>(); + for(Integer affairKey: affairKeyList){ + List affairFileList = affairFileRepository.findByAffairKey(affairKey); + fileList.addAll(affairFileList); + } + return fileList; + } public List selectStatusTotal(TypeStatistics typeStatistics) { return affairMapper.selectStatusTotal(typeStatistics); diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 2ada3b1a..44d9ec32 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -30,6 +30,8 @@ file.dir.majorStatus=/majorStatus file.dir.monitoring=/monitoring file.dir.intelligenceNetwork=/intelligenceNetwork +file.dir.affairTemp=/affairTemp + editor.img.view=/file/editorFileDisplay?fileNm= diff --git a/src/main/resources/static/js/igActivities/fpiMgt/affair/affairMgt.js b/src/main/resources/static/js/igActivities/fpiMgt/affair/affairMgt.js index ea86c7e0..22549c06 100644 --- a/src/main/resources/static/js/igActivities/fpiMgt/affair/affairMgt.js +++ b/src/main/resources/static/js/igActivities/fpiMgt/affair/affairMgt.js @@ -27,10 +27,10 @@ $(document).on('click', '#commitTab', function (){ $(document).on('click', '.affairTr', function (event){ const target = event.target; if(!(target.className === "apprvTd" || $(target).parents(".apprvTd").length>0)){ - const chkBox = $(this).find(".rowChkBox"); + const chkBox = $(this).find(".trChkBox"); if(chkBox.length>0){ $(".trChkBox").prop("checked", false); - chkBox[0].checked = !chkBox[0].checked; + chkBox[0].checked = true; } getAffairViewModal(Number($(this).find(".affairKey").val())); } @@ -147,6 +147,37 @@ $(document).on('change', '.apprvChkbox', function (){ } }) +$(document).on('click', '#fileDownBtn', function (){ + const selectedList = $(".trChkBox:checked") + if(selectedList.length<1){ + alert("대상이 없습니다."); + return false; + } + if(confirm("선택된 견문의 파일을 다운로드 하시겠습니까?")){ + const formData = new FormData(); + $.each(selectedList, function(idx, chkBox){ + formData.append("affairKeyList", $(chkBox).parents("tr").find(".affairKey").val()); + }) + contentFade("in"); + $.ajax({ + type : 'POST', + data : formData, + url : "/file/downloadAffairFiles", + processData: false, + contentType: false, + beforeSend: function (xhr){ + xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val()); + }, + success : function(result) { + contentFade("out"); + }, + error : function(xhr, status) { + contentFade("out"); + } + }) + } +}) + function getAffairViewModal(affairKey){ $.ajax({ url: '/affair/affairViewModal', diff --git a/src/main/resources/templates/igActivities/fpiMgt/affair/affairMgt.html b/src/main/resources/templates/igActivities/fpiMgt/affair/affairMgt.html index f9eb6578..2fecee2a 100644 --- a/src/main/resources/templates/igActivities/fpiMgt/affair/affairMgt.html +++ b/src/main/resources/templates/igActivities/fpiMgt/affair/affairMgt.html @@ -129,7 +129,7 @@ - + @@ -254,6 +254,7 @@
+
문서번호 분야1 분야2
-
+
-
- -
- -
-
- -
-
- - - - - - -
-
- - -
-
- - - +
+
+ +
+ +
+
+ +
+
- - - - - -
-
- - + + + + +
+
+ + +
+
+ + + + + + + + + + + + +
+
+ + +
-
-
+ +
-
- - - -
-
- - +
+ + + + +
+
+ + +
+
+ +
+
+ +
-
- + + + +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ +
-
- -
-
-
- - -
-
- - -
-
- -
-
- - -
-
- -
-
- -
-
-
- + + +