|
|
@ -1,5 +1,30 @@ |
|
|
|
package com.palnet.biz.api.comn.file.service; |
|
|
|
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.acnt.jwt.utils.JwtTokenUtil; |
|
|
|
import com.palnet.biz.api.comn.file.constant.ExtensionConstant; |
|
|
|
import com.palnet.biz.api.comn.file.constant.ExtensionConstant; |
|
|
|
import com.palnet.biz.api.comn.file.model.LaancPdfModel; |
|
|
|
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.exception.CustomException; |
|
|
|
import com.palnet.comn.utils.InstantUtils; |
|
|
|
import com.palnet.comn.utils.InstantUtils; |
|
|
|
import com.palnet.comn.utils.PdfUtils; |
|
|
|
import com.palnet.comn.utils.PdfUtils; |
|
|
|
|
|
|
|
|
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
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 |
|
|
|
@Slf4j |
|
|
|
@RequiredArgsConstructor |
|
|
|
@RequiredArgsConstructor |
|
|
@ -33,6 +46,12 @@ public class ComnFileService { |
|
|
|
private final PdfUtils pdfUtils; |
|
|
|
private final PdfUtils pdfUtils; |
|
|
|
private final JwtTokenUtil jwtTokenUtil; |
|
|
|
private final JwtTokenUtil jwtTokenUtil; |
|
|
|
private final ComFileBasRepository comFileBasRepository; |
|
|
|
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 |
|
|
|
* @param etcName |
|
|
|
* @return |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private String getLaancSaveName(String... etcName) { |
|
|
|
private String getLaancSaveName(ExtensionConstant extension, String... etcName) { |
|
|
|
|
|
|
|
|
|
|
|
String date = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss"); |
|
|
|
String date = InstantUtils.toDatetimeStringByFormat(Instant.now(), "yyyyMMddHHmmss"); |
|
|
|
|
|
|
|
|
|
|
@ -53,9 +72,7 @@ public class ComnFileService { |
|
|
|
.append(name); |
|
|
|
.append(name); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
result.append(extension.extension); |
|
|
|
|
|
|
|
|
|
|
|
result.append(ExtensionConstant.PDF.extension); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return result.toString(); |
|
|
|
return result.toString(); |
|
|
|
} |
|
|
|
} |
|
|
@ -70,7 +87,7 @@ public class ComnFileService { |
|
|
|
|
|
|
|
|
|
|
|
String airUser = model.getPilotName(); |
|
|
|
String airUser = model.getPilotName(); |
|
|
|
String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지
|
|
|
|
String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지
|
|
|
|
String fileName = getLaancSaveName(airUser, etc); |
|
|
|
String fileName = getLaancSaveName(ExtensionConstant.PDF, airUser, etc); |
|
|
|
|
|
|
|
|
|
|
|
// TODO 추후 img tag의 src로 들어가는 이미지들을 base64로 변환하여 html에 넣어줘야함
|
|
|
|
// TODO 추후 img tag의 src로 들어가는 이미지들을 base64로 변환하여 html에 넣어줘야함
|
|
|
|
// images 넣기(임시)
|
|
|
|
// images 넣기(임시)
|
|
|
@ -137,10 +154,133 @@ public class ComnFileService { |
|
|
|
ComFileBas comFileBas = comFileBasRepository.findById(fileSno).orElse(null); |
|
|
|
ComFileBas comFileBas = comFileBasRepository.findById(fileSno).orElse(null); |
|
|
|
if (comFileBas == null) throw new CustomException(ErrorCode.DATA_NOTFIND); |
|
|
|
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) { |
|
|
|
public String imagesToBase64ForSrc(String path) { |
|
|
|
StringBuilder str = new StringBuilder(); |
|
|
|
StringBuilder str = new StringBuilder(); |
|
|
|
ClassPathResource resource = new ClassPathResource(path); |
|
|
|
ClassPathResource resource = new ClassPathResource(path); |
|
|
@ -164,20 +304,12 @@ public class ComnFileService { |
|
|
|
} |
|
|
|
} |
|
|
|
return str.toString(); |
|
|
|
return str.toString(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public boolean fileUpload(ComFileBas comFileBas){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 마지막 fileGroupNo 가져와 +1 후 반환 |
|
|
|
* 마지막 fileGroupNo 가져와 +1 후 반환 |
|
|
|
* @return |
|
|
|
* @return |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private int lastFileGroupNo(){ |
|
|
|
private Integer lastFileGroupNo(){ |
|
|
|
ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileGroupNoDesc(); |
|
|
|
ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileGroupNoDesc(); |
|
|
|
int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1; |
|
|
|
int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1; |
|
|
|
|
|
|
|
|
|
|
|