diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java index a41b1029..a49b42aa 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java @@ -1,9 +1,12 @@ package com.palnet.biz.api.cns.qna.controller; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.util.MimeType; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.palnet.biz.api.cns.qna.model.QnaBasModel; @@ -18,6 +21,7 @@ import lombok.extern.slf4j.Slf4j; @RestController @Slf4j @RequiredArgsConstructor +@RequestMapping("/api/cns/qna") public class CnsQnaController { private final CnsQnaService cnsQnaService; @@ -27,10 +31,9 @@ public class CnsQnaController { @Tag(name = "QNA", description = "QNA 관련 API") @ApiOperation(value = "QnA 등록[답변추가]") public ResponseEntity insertQna(QnaInsertRQModel rq){ - log.warn("CnsFaqController - insertQna()"); - log.warn("rq -> {}", rq); + log.warn("CnsFaqController - insertQna()"); - + cnsQnaService.insertQna(rq); return ResponseEntity.ok().body(null); } @@ -56,8 +59,7 @@ public class CnsQnaController { @GetMapping("/delete") public ResponseEntity deleteQna(@RequestBody QnaBasModel rq){ log.warn("CnsFaqController - deleteQna()"); - log.warn("rq -> {}", rq); - + log.warn("rq -> {}", rq); return ResponseEntity.ok().body(null); } diff --git a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java index 464e3ff2..d62186cd 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java @@ -1,9 +1,15 @@ package com.palnet.biz.api.cns.qna.service; +import java.util.List; + +import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import com.palnet.biz.api.cns.qna.model.QnaInsertRQModel; import com.palnet.biz.api.comn.file.service.ComnFileService; +import com.palnet.comn.code.ErrorCode; +import com.palnet.comn.exception.CustomException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -18,6 +24,11 @@ public class CnsQnaService { public boolean insertQna(QnaInsertRQModel rq){ + log.warn("CnsQnaService - insertQna()"); + + List files = rq.getFiles(); + + comnFileService.fileUpload(files); return true; } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java index 0b740668..295a8099 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java @@ -1,5 +1,7 @@ package com.palnet.biz.api.comn.file.constant; +import java.util.HashSet; + public enum ExtensionConstant { JPG(".jpg"), PNG(".png"), @@ -14,7 +16,24 @@ public enum ExtensionConstant { public final String extension; + public HashSet hashExtension; + private ExtensionConstant(String extension) { this.extension = extension; } + + public static ExtensionConstant fromExtension(String extension) { + try { + for (ExtensionConstant constant : ExtensionConstant.values()) { + if (constant.extension.equals(extension)) { + + return constant; + } + } + } catch (Exception e) { + return null; + } + + return null; + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java index addede75..c774be7e 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java @@ -1,5 +1,30 @@ package com.palnet.biz.api.comn.file.service; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Instant; +import java.util.List; +import java.util.Objects; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.transaction.Transactional; + +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.comn.file.constant.ExtensionConstant; import com.palnet.biz.api.comn.file.model.LaancPdfModel; @@ -9,21 +34,9 @@ import com.palnet.comn.code.ErrorCode; import com.palnet.comn.exception.CustomException; import com.palnet.comn.utils.InstantUtils; import com.palnet.comn.utils.PdfUtils; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.io.IOUtils; -import org.springframework.core.io.ClassPathResource; -import org.springframework.stereotype.Service; - -import javax.transaction.Transactional; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.time.Instant; -import java.util.Base64; -import java.util.List; @Slf4j @RequiredArgsConstructor @@ -33,6 +46,12 @@ public class ComnFileService { private final PdfUtils pdfUtils; private final JwtTokenUtil jwtTokenUtil; private final ComFileBasRepository comFileBasRepository; + private final HttpServletRequest request; + private final HttpServletResponse response; + + + @Value("${base-url}") + private String BASE_PATH; /** * 파일명 만들기, 앞에 기본으로 금일 날짜있음 @@ -41,7 +60,7 @@ public class ComnFileService { * @param etcName * @return */ - private String getLaancSaveName(String... etcName) { + private String getLaancSaveName(ExtensionConstant extension, String... etcName) { String date = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss"); @@ -53,9 +72,7 @@ public class ComnFileService { .append(name); } - - - result.append(ExtensionConstant.PDF.extension); + result.append(extension.extension); return result.toString(); } @@ -70,7 +87,7 @@ public class ComnFileService { String airUser = model.getPilotName(); String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지 - String fileName = getLaancSaveName(airUser, etc); + String fileName = getLaancSaveName(ExtensionConstant.PDF, airUser, etc); // TODO 추후 img tag의 src로 들어가는 이미지들을 base64로 변환하여 html에 넣어줘야함 // images 넣기(임시) @@ -137,10 +154,133 @@ public class ComnFileService { ComFileBas comFileBas = comFileBasRepository.findById(fileSno).orElse(null); if (comFileBas == null) throw new CustomException(ErrorCode.DATA_NOTFIND); - pdfUtils.fileDownload(comFileBas); + InputStream inputStream = null; + OutputStream outputStream = null; + try { + File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm()); + inputStream = new FileInputStream(pdfFile); + + String fileOriName = comFileBas.getFileOriNm(); + fileOriName = URLEncoder.encode(comFileBas.getFileOriNm(), StandardCharsets.UTF_8); + + response.setContentType("application/octet-stream"); + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileOriName + "\""); + // response.setContentLengthLong(Long.parseLong(comFileBas.getFileSize())); + // response.setStatus(HttpServletResponse.SC_OK); + + outputStream = response.getOutputStream(); + + byte[] buffer = new byte[1024]; //1KB 설정 + int length; + + while ((length = inputStream.read(buffer)) != -1) { + outputStream.write(buffer); + } + + } catch (FileNotFoundException e) { + throw new CustomException(ErrorCode.DATA_NO); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (outputStream != null) { + Objects.requireNonNull(outputStream).flush(); + outputStream.close(); + } + + if (inputStream != null) { + inputStream.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + + } + + } + + public boolean fileUpload(List files){ + + if(!this.validCheck(files)) throw new CustomException(ErrorCode.NON_VALID_PARAMETER); + + String fileGroupNo = lastFileGroupNo().toString(); + + // TODO : 절대경로 + String absPath = "/Users/igyeongdo/WokrSpace/"; + + String fileUrl = new StringBuilder() + .append(absPath) + .append(this.BASE_PATH) + .append(InstantUtils.toDateStringByFormat(Instant.now(), "yyyyMMdd")) + .append("/") + .toString(); + + + + + for(MultipartFile file : files){ + + String oriNm = file.getOriginalFilename(); + String extension = oriNm.substring(oriNm.lastIndexOf(".")); + String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지 + String fileName = this.getLaancSaveName(ExtensionConstant.fromExtension(extension), fileGroupNo, "qna", etc); + + log.error("fileName -> {}", fileName); + + try { + + Path directoryPath = Paths.get(fileUrl); + if (!Files.exists(directoryPath)) { + Files.createDirectories(directoryPath); + } + // 파일 저장 경로 + String filePath = fileUrl + fileName; + + File saveFile = new File(filePath); + file.transferTo(saveFile); + + } catch (IOException e) { + e.printStackTrace(); + } + } + + + return true; } + /** + * 정해진 확장자만 올 수 있도록 validation처리, + * TODO :: 혹시 mime 타입으로 확인하여 처리해야 할까요? + * @param files + * @return + */ + private boolean validCheck(List files){ + + for(MultipartFile file : files){ + + try { + String oriNm = file.getOriginalFilename(); + String extension = oriNm.substring(oriNm.lastIndexOf(".")); + + ExtensionConstant constants = ExtensionConstant.fromExtension(extension); + + // 허락된 확장자가 아닐 경우 return false + if(constants == null) return false; + + + } catch (Exception e) { + // 확장자가 없는 파일일 경우 return false; + return false; + } + + } + + return true; + } + + public String imagesToBase64ForSrc(String path) { StringBuilder str = new StringBuilder(); ClassPathResource resource = new ClassPathResource(path); @@ -164,20 +304,12 @@ public class ComnFileService { } return str.toString(); } - - - public boolean fileUpload(ComFileBas comFileBas){ - - - - return true; - } - + /** * 마지막 fileGroupNo 가져와 +1 후 반환 * @return */ - private int lastFileGroupNo(){ + private Integer lastFileGroupNo(){ ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileGroupNoDesc(); int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1; diff --git a/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java index 242c7a3c..d9cda037 100644 --- a/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java +++ b/pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java @@ -161,56 +161,5 @@ public class PdfUtils { return result; } - - /** - * 파일 Download - * - * @param comFileBas - */ - public void fileDownload(ComFileBas comFileBas) { - InputStream inputStream = null; - OutputStream outputStream = null; - - try { - File pdfFile = new File(comFileBas.getFilePath() + comFileBas.getFileSaveNm()); - inputStream = new FileInputStream(pdfFile); - - String fileOriName = comFileBas.getFileOriNm(); - fileOriName = URLEncoder.encode(comFileBas.getFileOriNm(), StandardCharsets.UTF_8); - - response.setContentType("application/octet-stream"); - response.setCharacterEncoding("UTF-8"); - response.setHeader("Content-Disposition", "attachment; filename=\"" + fileOriName + "\""); - // response.setContentLengthLong(Long.parseLong(comFileBas.getFileSize())); - // response.setStatus(HttpServletResponse.SC_OK); - - outputStream = response.getOutputStream(); - - byte[] buffer = new byte[1024]; //1KB 설정 - int length; - - while ((length = inputStream.read(buffer)) != -1) { - outputStream.write(buffer); - } - - } catch (FileNotFoundException e) { - throw new CustomException(ErrorCode.DATA_NO); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if (outputStream != null) { - Objects.requireNonNull(outputStream).flush(); - outputStream.close(); - } - - if (inputStream != null) { - inputStream.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - - } - } + }