Browse Source

file업로드 추가

pull/9/head
lkd9125 11 months ago
parent
commit
fceb5159cf
  1. 12
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/controller/CnsQnaController.java
  2. 11
      pav-server/src/main/java/com/palnet/biz/api/cns/qna/service/CnsQnaService.java
  3. 19
      pav-server/src/main/java/com/palnet/biz/api/comn/file/constant/ExtensionConstant.java
  4. 190
      pav-server/src/main/java/com/palnet/biz/api/comn/file/service/ComnFileService.java
  5. 53
      pav-server/src/main/java/com/palnet/comn/utils/PdfUtils.java

12
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<Object> 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<Object> deleteQna(@RequestBody QnaBasModel rq){
log.warn("CnsFaqController - deleteQna()");
log.warn("rq -> {}", rq);
log.warn("rq -> {}", rq);
return ResponseEntity.ok().body(null);
}

11
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<MultipartFile> files = rq.getFiles();
comnFileService.fileUpload(files);
return true;
}

19
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<ExtensionConstant> 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;
}
}

190
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<MultipartFile> 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<MultipartFile> 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;

53
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();
}
}
}
}

Loading…
Cancel
Save