knu project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

407 lines
16 KiB

/**********************************************************************************
* 프로그램명 : remit_excepted_list.java 프로그램설명 : 정해준 디렉토리 내의 디렉토리이름과 파일 이름순으로 정렬 작 성 자 : 강 원 중 작 성 일 : 2002/3/31 최신변경일 :
* 2002. 6.29 다운 받은곳 : http://cpost.go.kr/shop/shop/way-board.php?db=sq&j=dn&number=57
***********************************************************************************/
package kr.co.kihyun.io;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.channels.FileChannel;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import kr.co.kihyun.beans.user.HttpSSOLogin;
import kr.co.kihyun.db.CommonDBManager;
import kr.co.kihyun.lang.Encoder;
import kr.co.kihyun.lang.MString;
import kr.co.kihyun.moumi.Moumi;
import kr.co.kihyun.moumi.MoumiConfig;
import kr.co.kihyun.text.html.GetAttachFileName;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.StopWatch;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class FileUtil {
private static final Logger LOG = LoggerFactory.getLogger(FileUtil.class);
public static String getName(String filename, String appStr) {
/* String tmpDot = Integer.toString(filename.lastIndexOf("."));
String dumy = ".";
int indexOfdot;
if(tmpDot.equals("")){
indexOfdot = filename.lastIndexOf(dumy);
}else{
indexOfdot = filename.lastIndexOf(tmpDot);
}*/
int indexOfdot = filename.lastIndexOf(".");//파일이름중에 . 있는지 없는지 확인
return filename.substring(0, indexOfdot) + "_" + appStr + filename.substring(indexOfdot);
}
public static String getName(String filename, String deptID, String userID, String docID, String appStr) {
/* String tmpDot = Integer.toString(filename.lastIndexOf("."));
String dumy = ".";
int indexOfdot;
if(tmpDot.equals("")){
indexOfdot = filename.lastIndexOf(dumy);
}else{
indexOfdot = filename.lastIndexOf(tmpDot);
}*/
int indexOfdot = filename.lastIndexOf(".");//파일이름중에 . 있는지 없는지 확인
return deptID + "_" + userID + "_" + docID + "_" + appStr + filename.substring(indexOfdot);
}
public static String getFirstName(String filename) {
/* String tmpDot = Integer.toString(filename.lastIndexOf("."));
String dumy = ".";
int indexOfdot;
if(tmpDot.equals("")){
indexOfdot = filename.lastIndexOf(dumy);
}else{
indexOfdot = filename.lastIndexOf(tmpDot);
}*/
int indexOfdot = filename.lastIndexOf(".");
return filename.substring(0, indexOfdot);
}
public static String getExtName(String filename) {
/* String tmpDot = Integer.toString(filename.lastIndexOf("."));
String dumy = ".";
int indexOfdot;
if(tmpDot.equals("")){
indexOfdot = filename.lastIndexOf(dumy);
}else{
indexOfdot = filename.lastIndexOf(tmpDot);
}*/
int indexOfdot = filename.lastIndexOf(".");
return filename.substring(indexOfdot);
}
public static void putInFiles(String svrFilenames, IUploadable uploadable) throws IOException {
putUpFiles(svrFilenames,uploadable); //디비에 파일을 인풋시킨다.
}
public static void putUpFiles(String svrFilenames, IUploadable uploadable) throws IOException {
if (MString.isNull(svrFilenames))
return;
File sourceDir = new File(MoumiConfig.getFileDirectory().getPath());
for (String fileName : svrFilenames.split(";")) {
if (!MString.isNull(fileName)) {
File sourceFile = new File(sourceDir, fileName);
// System.out.println("sourceFile.exists() --- "+sourceFile.exists() + "\nuploadable.getAttachments().get(fileName) --- " +uploadable.getAttachments().get(fileName));
if (!sourceFile.exists())
continue;
//14.부적절한 자원 해제(FileInputStream/FileOutputStream)_CWE-404 : Update by KWON,HAN
//FileInputStream fis = new FileInputStream(sourceFile);
//byte[] content = new byte[(int) sourceFile.length()];
//Byte[] contentObj = new Byte[content.length];
//fis.read(content);//파일의 내용을 읽어온다.
//for (int i = 0; i < content.length; i++)
//contentObj[i] = content[i];
//uploadable.addAttachment(fileName, Arrays.asList(contentObj));
//fis.close();//파일실행을 끊어줌.
//
FileInputStream fis = null;
try {
fis = new FileInputStream(sourceFile);
byte[] content = new byte[(int) sourceFile.length()];
Byte[] contentObj = new Byte[content.length];
fis.read(content);//파일의 내용을 읽어온다.
for (int i = 0; i < content.length; i++)
contentObj[i] = content[i];
uploadable.addAttachment(fileName, Arrays.asList(contentObj));
} catch (IOException e) {
e.printStackTrace();
} finally {
fis.close(); //파일실행을 끊어줌.// 예외 발생 여부와 상관없이 자원 해제
}
//===================================================================================
}
}
}
//20170821 첨부파일 저장을 위해 추가 by wonseok Lee
public static void putInFiles(String svrFilenames, IUploadable uploadable, MultipartRequest multi) throws IOException {
putUpFiles(svrFilenames,uploadable, multi); //디비에 파일을 인풋시킨다.
}
public static void putUpFiles(String svrFilenames, IUploadable uploadable, MultipartRequest multi) throws IOException {
if (MString.isNull(svrFilenames))
return;
File sourceDir = null;
String docID = "";
String modeChk = MString.checkNull(multi.getParameter("modify"));
String reportID = MString.checkNull(multi.getParameter("reportID"));
String dtID = MString.checkNull(HttpSSOLogin.getDeptID(multi));
if(modeChk.equals("modify")){
docID = MString.checkNull(multi.getParameter("docId"));
}
else {
docID = MString.checkNull(multi.getParameter("repDocID"));
}
sourceDir = new File(MoumiConfig.getFileDirectory()+"/"+docID+"/"+reportID+"/"+dtID+"/");
for (String fileName : svrFilenames.split(";")) {
if (!MString.isNull(fileName)) {
File sourceFile = new File(sourceDir, fileName);
if (!sourceFile.exists())
continue;
//System.out.print("sourceFile.exists["+fileName+"]\n");
//14.부적절한 자원 해제(FileInputStream/FileOutputStream)_CWE-404 : Update by KWON,HAN
//FileInputStream fis = new FileInputStream(sourceFile);
//byte[] content = new byte[(int) sourceFile.length()];
//Byte[] contentObj = new Byte[content.length];
//fis.read(content);//파일의 내용을 읽어온다.
//for (int i = 0; i < content.length; i++)
//contentObj[i] = content[i];
//uploadable.addAttachment(fileName, Arrays.asList(contentObj));
//fis.close();//파일실행을 끊어줌.
//
FileInputStream fis = null;
try {
fis = new FileInputStream(sourceFile);
byte[] content = new byte[(int) sourceFile.length()];
Byte[] contentObj = new Byte[content.length];
fis.read(content);//파일의 내용을 읽어온다.
for (int i = 0; i < content.length; i++)
contentObj[i] = content[i];
uploadable.addAttachment(fileName, Arrays.asList(contentObj));
} catch (IOException e) {
e.printStackTrace();
} finally {
fis.close(); //파일실행을 끊어줌.// 예외 발생 여부와 상관없이 자원 해제
}
//===================================================================================
}
}
}
public static void delUpFiles(String svrFilenames, IUploadable uploadable) throws IOException {
try {
if (MString.isNull(svrFilenames))
return;
//9.디렉토리 경로 조작(프로퍼티로딩)_CWE-22/23 : Add by KWON,HAN
if(svrFilenames.contains("..") || svrFilenames. contains("/")) { // 특수문자열 검증
LOG.debug("9.디렉토리 경로 조작(프로퍼티로딩)_CWE-22/23 : Test OK {}", svrFilenames);
return;
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
File sourceDir = new File(MoumiConfig.getFileDirectory().getPath());
for (String fileName : svrFilenames.split(";")) {
File f = new File(sourceDir,fileName);
if (f.exists() && f.isFile())
f.delete();
//System.out.print("DEL FileUtil Page File Name: "+svrFilenames+" Full Path and File Name: "+f+"\n");
}
} catch (Exception e) {
//34.오류메세지를 통한 정보 노출(toString)_CWE-209 : Update by YOUNGJUN,CHO
//System.out.println(e.toString());
LOG.error("\nFileUtil delUpFiles Exception - {}", e.toString());
//================================================
}
}
public static String getGlobalBoardAttachmentsPath(){
return MoumiConfig.getFileDirectory().getPath()+"/boardattachment/";
}
//게시판 첨부파일 가져오기
public static String getBoardAttachFileUrl(Long id,String fileName,HttpServletRequest req){
ArrayList<String> fns= getBoardAttachmentsFileNames(id,req,false);
for (String fn : fns) {
if(fn.equals(fileName)){
String opath= getGlobalBoardAttachmentsPath()+id+"/files/"+fn;
String tpath="/tempfile/board/"+UUID.randomUUID()+"/";
String rtpath=req.getSession().getServletContext().getRealPath(tpath)+"/";
File tfile=new File(rtpath);
try {
if(!tfile.exists())tfile.mkdirs();
String tPath = tpath + fn;
rtpath+=fn;
tfile=new File(rtpath);
final File tempfile=tfile;
FileUtils.copyFile(new File(opath), tfile);
new Thread(){
public void run() {
try {
int cnt=0;
while(tempfile.getParentFile().exists()){
Thread.sleep(5000);
tempfile.getParentFile().delete();
if(cnt>100)return;
cnt++;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
return tpath;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
//파일로 존재하지 않을경우 디비에서 가져와서 파일로 저장한다
public static ArrayList<String> getBoardAttachmentsFileNames(Long id, HttpServletRequest req, boolean isreset){
ArrayList<String> rslt = new ArrayList<String>();
//String globalFilePathStr=Moumi.getMessageBundle().getString("moumi.dir.upload")+"/boardattachment";
boolean fromFile = false;
String globalFilePathStr = getGlobalBoardAttachmentsPath();
if(!globalFilePathStr.endsWith("/")){
globalFilePathStr+="/";
}
System.out.println("globalFilePathStr ========== " + globalFilePathStr );
File globalFilePath = new File(globalFilePathStr);
if(!globalFilePath.exists()){
globalFilePath.mkdirs();
}
String boardAttachPath = globalFilePathStr + id + "/";
System.out.println("boardAttachPath ========== " + boardAttachPath );
File boardAttachFile=new File(boardAttachPath);
if(isreset){
if(boardAttachFile.exists()){
try {
FileUtils.deleteDirectory(boardAttachFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
File fnsFile = new File(boardAttachPath+"fns");
System.out.println("boardAttachFile 1111 ========== " + boardAttachFile );
if(boardAttachFile.exists()){
try {
System.out.println("fnsFile 1111 ==== "+ fnsFile);
if(fnsFile.exists()){
System.out.println("fnsFile ==== "+ fnsFile);
FileInputStream fis = new FileInputStream(fnsFile);
InputStreamReader reader = new InputStreamReader(fis,"utf-8");
BufferedReader br = new BufferedReader(reader);
String line = br.readLine();
while(line != null){
rslt.add(line);
line = br.readLine();
}
br.close();
reader.close();
fis.close();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
fromFile = true;
}else{
boardAttachFile.mkdirs();
System.out.println("boardAttachFile 222 ==== "+ boardAttachFile);
Map<String, List<Byte>> map = getBoardAttachmentsFromDB(id, req);
if(map == null)return rslt;
Set<String> filenames = map.keySet();
String fns = StringUtils.join(filenames.iterator(), "\r\n");
try {
PrintWriter pw = new PrintWriter(fnsFile,"utf-8");
pw.write(fns);
pw.flush();
pw.close();
} catch (Exception e) {
e.printStackTrace();
}
for (String fn : filenames) {
rslt.add(fn);
try {
File fnFile = new File(boardAttachPath+"files/"+fn);
fnFile.getParentFile().mkdirs();
fnFile.createNewFile();
List<Byte> flist = map.get(fn);
if(flist == null)continue;
FileOutputStream fos = new FileOutputStream(fnFile);
for(int b:flist)fos.write(b);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*System.out.println("=========================================================="
+id+" - "+(fromFile?"파일에서":"디비에서")+"가져옴 걸린초 : "+sw.getTime());*/
return rslt;
}
public static Map<String, List<Byte>> getBoardAttachmentsFromDB(Long id,HttpServletRequest req){
Map<String, List<Byte>> map=null;
//req.getSession().getServletContext().setAttribute("onattachdownload", id);
CommonDBManager acdbm = new CommonDBManager();
ResultSet ars = null;
try{
ars = acdbm.execQuery("select ATTACHMENTS from MOUMI_BOARD where id=? ",id);
if(ars.next()){
InputStream is = ars.getBinaryStream(1);
System.out.println("is ==== "+is);
if(is != null){
ObjectInputStream ois = new ObjectInputStream(is);
map = (Map<String, List<Byte>>)ois.readObject();
ois.close();
is.close();
}
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
try{ars.close();}catch(Exception e){}
acdbm.execClose();
}
//req.getSession().getServletContext().setAttribute("onattachdownload", null);
return map;
}
}