package egovframework.com.cmm.web;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLEncoder;
import java.util.Map;
import egovframework.com.cmm.UserVO;
import egovframework.com.cmm.service.EgovFileMngService;
import egovframework.com.cmm.service.FileVO;
import egovframework.let.cop.bbs.service.BoardVO;
import egovframework.let.cop.bbs.service.EgovBBSManageService;
import egovframework.rte.fdl.security.userdetails.util.EgovUserDetailsHelper;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 파일 다운로드를 위한 컨트롤러 클래스
* @author 공통서비스개발팀 이삼섭
* @since 2009.06.01
* @version 1.0
* @see
*
*
* << 개정이력(Modification Information) >>
*
* 수정일 수정자 수정내용
* ------- -------- ---------------------------
* 2009.3.25 이삼섭 최초 생성
*
* Copyright (C) 2009 by MOPAS All right reserved.
*
*/
@Controller
public class EgovFileDownloadController {
@Resource(name = "EgovFileMngService")
private EgovFileMngService fileService;
@Resource(name = "EgovBBSManageService")
private EgovBBSManageService bbsMngService;
private static final Logger LOGGER = LoggerFactory.getLogger(EgovFileDownloadController.class);
/**
* 브라우저 구분 얻기.
*
* @param request
* @return
*/
private String getBrowser(HttpServletRequest request) {
String header = request.getHeader("User-Agent");
if (header.indexOf("MSIE") > -1) {
return "MSIE";
} else if (header.indexOf("Trident") > -1) { // IE11 문자열 깨짐 방지
return "Trident";
} else if (header.indexOf("Chrome") > -1) {
return "Chrome";
} else if (header.indexOf("Opera") > -1) {
return "Opera";
}
return "Firefox";
}
/**
* Disposition 지정하기.
*
* @param filename
* @param request
* @param response
* @throws Exception
*/
private void setDisposition(String filename, HttpServletRequest request, HttpServletResponse response) throws Exception {
String browser = getBrowser(request);
String dispositionPrefix = "attachment; filename=";
String encodedFilename = null;
if (browser.equals("MSIE")) {
encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
} else if (browser.equals("Trident")) { // IE11 문자열 깨짐 방지
encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
} else if (browser.equals("Firefox")) {
encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
} else if (browser.equals("Opera")) {
encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
} else if (browser.equals("Chrome")) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < filename.length(); i++) {
char c = filename.charAt(i);
if (c > '~') {
sb.append(URLEncoder.encode("" + c, "UTF-8"));
} else {
sb.append(c);
}
}
encodedFilename = sb.toString();
} else {
//throw new RuntimeException("Not supported browser");
throw new IOException("Not supported browser");
}
response.setHeader("Content-Disposition", dispositionPrefix + "\"" + encodedFilename + "\"");
if ("Opera".equals(browser)) {
response.setContentType("application/octet-stream;charset=UTF-8");
}
}
/**
* 첨부파일로 등록된 파일에 대하여 다운로드를 제공한다.
*
* @param commandMap
* @param respons
* @throws Exception
*/
@RequestMapping(value = "/cmm/fms/FileDown.do")
public void cvplFileDownload(@RequestParam Map commandMap, HttpServletRequest request, HttpServletResponse response) throws Exception {
String atchFileId = (String) commandMap.get("atchFileId");
String fileSn = (String) commandMap.get("fileSn");
String bbsId = (String) commandMap.get("bbsId");
String nttId = (String) commandMap.get("nttId");
// 다운 > 관리자 유무, 게시판 유무, 비공개 유무, 본인글 유무
// 권한 체크
LOGGER.debug("@@@@@@atchFileId : "+atchFileId);
LOGGER.debug("@@@@@@fileSn : "+fileSn);
LOGGER.debug("@@@@@@bbsId : "+bbsId);
LOGGER.debug("@@@@@@nttId : "+nttId);
Boolean isAuth = true;
if (!EgovUserDetailsHelper.getAuthorities().contains("ROLE_USER_MEMBER")) { // 관리자 유무
LOGGER.debug("JW1023 in if");
BoardVO boardVO = new BoardVO();
boardVO.setAtchFileId(atchFileId);
boardVO.setBbsId(bbsId);
BoardVO bdVO = bbsMngService.selectBoardArticleByAtchFileId(boardVO);
LOGGER.debug("JW1023 in if");
if (bdVO != null && (bdVO.getSecretAt() != null && bdVO.getSecretAt().equals("Y"))) {
UserVO userVO = (UserVO)request.getSession().getAttribute("userVO"); // 사용자 정보
if (userVO == null || !bdVO.getMblDn().equals(userVO.getMblDn())) isAuth = false; // 비공개, 본인글 여부
}
}
if(bbsId != null) {
BoardVO boardVO = new BoardVO();
boardVO.setBbsId(bbsId);
Long num = new Long(nttId);
boardVO.setNttId(num);
BoardVO bdVO = bbsMngService.selectBoardArticleWeb(boardVO);
if(!atchFileId.equals(bdVO.getAtchFileId())) {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter printwriter = response.getWriter();
printwriter.println("");
printwriter.flush();
printwriter.close();
return ;
}
}
// 파일 다운 권한 없음.
if (!isAuth) return;
LOGGER.debug("JW1023 isAuthTrue");
FileVO fileVO = new FileVO();
fileVO.setAtchFileId(atchFileId);
fileVO.setFileSn(fileSn);
FileVO fvo = fileService.selectFileInf(fileVO);
if(fvo == null){
response.setContentType("application/x-msdownload");
PrintWriter printwriter = response.getWriter();
printwriter.println("");
printwriter.println("
Could not get file name:
");
printwriter.println("
");
printwriter.println("
© webAccess");
printwriter.println("");
printwriter.flush();
printwriter.close();
return ;
}
File uFile = new File(fvo.getFileStreCours(), fvo.getStreFileNm());
long fSize = uFile.length();
if (fSize > 0) {
String mimetype = "application/x-msdownload";
response.setContentType(mimetype);
setDisposition(fvo.getOrignlFileNm(), request, response);
//response.setContentLength(fSize);
BufferedInputStream in = null;
BufferedOutputStream out = null;
try {
in = new BufferedInputStream(new FileInputStream(uFile));
out = new BufferedOutputStream(response.getOutputStream());
FileCopyUtils.copy(in, out);
out.flush();
} catch (Exception ex) {
LOGGER.debug("IGNORED: {}", ex.getMessage());
} finally {
if (in != null) {
try {
in.close();
} catch (Exception ignore) {
LOGGER.debug("IGNORED: {}", ignore.getMessage());
}
}
if (out != null) {
try {
out.close();
} catch (Exception ignore) {
LOGGER.debug("IGNORED: {}", ignore.getMessage());
}
}
}
} else {
response.setContentType("application/x-msdownload");
PrintWriter printwriter = response.getWriter();
printwriter.println("");
printwriter.println("
Could not get file name:
" + fvo.getOrignlFileNm() + "
");
printwriter.println("
");
printwriter.println("
© webAccess");
printwriter.println("");
printwriter.flush();
printwriter.close();
}
}
/**
* 첨부파일로 등록된 PDF파일을 미리보기 한다.
*
* @param commandMap
* @param response
* @throws Exception
*/
@RequestMapping(value = "/cmm/fms/pdfView.do")
public void pdfView(@RequestParam Map commandMap, HttpServletRequest request, HttpServletResponse response) throws Exception {
String atchFileId = (String) commandMap.get("atchFileId");
String fileSn = (String) commandMap.get("fileSn");
FileVO fileVO = new FileVO();
fileVO.setAtchFileId(atchFileId);
fileVO.setFileSn(fileSn);
FileVO fvo = fileService.selectFileInf(fileVO);
if(fvo == null){
response.setContentType("application/x-msdownload");
PrintWriter printwriter = response.getWriter();
printwriter.println("");
printwriter.println("
Could not get file name:
");
printwriter.println("
");
printwriter.println("
© webAccess");
printwriter.println("");
printwriter.flush();
printwriter.close();
return ;
}
FileInputStream fis = null;
BufferedOutputStream bos = null;
try{
/* String pdfFileName = "C:/upload/TEST.pdf";
File pdfFile = new File(pdfFileName);*/
File pdfFile = new File(fvo.getFileStreCours(), fvo.getStreFileNm());
//클라이언트 브라우져에서 바로 보는 방법(헤더 변경)
response.setContentType("application/pdf");
//★ 이 구문이 있으면 [다운로드], 이 구문이 없다면 바로 target 지정된 곳에 view 해줍니다.
//response.addHeader("Content-Disposition", "attachment; filename="+pdfFile.getName()+".pdf");
//파일 읽고 쓰는 건 일반적인 Write방식이랑 동일합니다. 다만 reponse 출력 스트림 객체에 write.
fis = new FileInputStream(pdfFile);
int size = fis.available(); //지정 파일에서 읽을 수 있는 바이트 수를 반환
byte[] buf = new byte[size]; //버퍼설정
int readCount = fis.read(buf);
response.flushBuffer();
bos = new BufferedOutputStream(response.getOutputStream());
bos.write(buf, 0, readCount);
bos.flush();
} catch(Exception e) {
// e.printStackTrace();
System.out.println("pdfView exception");
} finally {
try{
if (fis != null) fis.close(); //close는 꼭! 반드시!
if (bos != null) bos.close();
} catch (IOException e) {
// e.printStackTrace();
System.out.println("pdfView exception");
}
}
}
}