diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java index a8f1a8b6..292daa44 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/controller/BasFlightController.java @@ -35,7 +35,6 @@ import com.palnet.biz.jpa.entity.ComFileBas; import com.palnet.biz.scheduler.ctr.service.CtrTrnsLctnService; import com.palnet.comn.exception.CustomException; import com.palnet.comn.utils.AreaUtils; -import com.palnet.comn.utils.PdfUtils; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @@ -53,18 +52,14 @@ public class BasFlightController { private final CtrTrnsLctnService ctrTrnsLctnService; private final AreaUtils utils; private final TemplateService templateService; - private final PdfUtils pdfUtils; - - @Autowired - public BasFlightController(BasFlightService basFlightService, Environment env, CtrTrnsLctnService ctrTrnsLctnService, AreaUtils AreaUtils, TemplateService templateService, PdfUtils pdfUtils) { + public BasFlightController(BasFlightService basFlightService, Environment env, CtrTrnsLctnService ctrTrnsLctnService, AreaUtils AreaUtils, TemplateService templateService) { this.basFlightService = basFlightService; this.env = env; this.ctrTrnsLctnService = ctrTrnsLctnService; this.utils = AreaUtils; - this.templateService = templateService; - this.pdfUtils = pdfUtils; + this.templateService = templateService; } @GetMapping("/area") @@ -432,6 +427,12 @@ public class BasFlightController { templateService.save(comFileBas); } + @GetMapping("/laanc-pdf/download") + @Tag(name = "비행계획서", description = "비행계획서 관련 API") + @ApiOperation(value = "Laanc 공문 다운로드") + public void downloadPDF(int fileSno){ + templateService.fileDownload(fileSno); + } } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java index 7ad8f748..616d0185 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/service/BasFlightService.java @@ -47,8 +47,11 @@ import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; +import javax.servlet.http.HttpServletResponse; + @Slf4j @RequiredArgsConstructor @@ -838,5 +841,4 @@ public class BasFlightService { return jsonObject; } - } diff --git a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/service/TemplateService.java b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/service/TemplateService.java index 09b0a7b1..af230e18 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/service/TemplateService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/bas/flight/template/service/TemplateService.java @@ -1,17 +1,15 @@ package com.palnet.biz.api.bas.flight.template.service; import java.io.File; -import java.io.FileOutputStream; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.io.StringReader; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Paths; +import java.io.OutputStream; +import java.net.URLEncoder; import java.time.Instant; -import java.util.Map; -import java.util.Map.Entry; +import java.util.Objects; +import javax.servlet.http.HttpServletResponse; import javax.transaction.Transactional; import org.springframework.beans.factory.annotation.Autowired; @@ -22,6 +20,8 @@ import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.bas.flight.template.vo.LaancPdfVO; import com.palnet.biz.jpa.entity.ComFileBas; import com.palnet.biz.jpa.repository.com.ComFileBasRepository; +import com.palnet.comn.code.ErrorCode; +import com.palnet.comn.exception.CustomException; import com.palnet.comn.utils.InstantUtils; import com.palnet.comn.utils.PdfUtils; @@ -106,4 +106,18 @@ public class TemplateService { comFileBasRepository.save(comFileBas); } + /** + * 파일 다운로드 + * @param fileSno + * @param response + */ + public void fileDownload(int fileSno) { + + ComFileBas comFileBas = comFileBasRepository.findById(fileSno).orElse(null); + if(comFileBas == null) throw new CustomException(ErrorCode.DATA_NOTFIND); + + pdfUtils.fileDownload(comFileBas); + + } + } diff --git a/pav-server/src/main/java/com/palnet/biz/config/convert/StringToInstantBinding.java b/pav-server/src/main/java/com/palnet/biz/config/convert/StringToInstantBinding.java index 4d765b75..47d87cbf 100644 --- a/pav-server/src/main/java/com/palnet/biz/config/convert/StringToInstantBinding.java +++ b/pav-server/src/main/java/com/palnet/biz/config/convert/StringToInstantBinding.java @@ -17,10 +17,8 @@ public class StringToInstantBinding implements Converter { private final String ZONE = "Asia/Seoul"; @Override - public Instant convert(String date) { - log.error("StringToInstantBinding - convert()"); - log.error("date -> {}", date); - + public Instant convert(String date) { + if(InstantUtils.isValidFormat(date, DATETIME_FORMAT)) { return InstantUtils.fromDatetimeString(date); } else if(InstantUtils.isValidFormat(date, DATE_FORMAT)){ @@ -32,7 +30,6 @@ public class StringToInstantBinding implements Converter { log.error("ERROR : ", e); } } - return null; } diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java index db35bd93..552c6620 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/com/ComFileBasRepository.java @@ -6,7 +6,7 @@ import org.springframework.stereotype.Repository; import com.palnet.biz.jpa.entity.ComFileBas; @Repository -public interface ComFileBasRepository extends JpaRepository{ +public interface ComFileBasRepository extends JpaRepository{ public ComFileBas findFirstByOrderByFileSnoDesc(); } 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 9217365f..b88bea2f 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 @@ -1,19 +1,27 @@ package com.palnet.comn.utils; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.io.StringReader; +import java.net.URLEncoder; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.time.Instant; import java.util.Map; import java.util.Map.Entry; +import java.util.Objects; + +import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.access.method.P; import org.springframework.stereotype.Component; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; @@ -35,13 +43,16 @@ import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline; import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline; import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline; import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext; -import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; import com.palnet.biz.api.bas.flight.template.vo.PdfBaseVO; import com.palnet.biz.jpa.entity.ComFileBas; +import com.palnet.comn.code.ErrorCode; +import com.palnet.comn.exception.CustomException; @Component public class PdfUtils { + @Autowired + private HttpServletResponse response; @Autowired private TemplateEngine templateEngine; @@ -166,4 +177,55 @@ 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(), "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(); + } + + } + } }