Programing/JAVA

JAVA 임시 파일 생성, FTP 파일 업로드

리커니 2018. 1. 18.
반응형

 

JAVA 임시 파일 생성, FTP 파일 업로드

 

[테스트 환경]

알FTP

Spring 4.0

 

구현하려고 하는 것은 String 값을 입력 받아서 txt 파일을 만들어 업로드 하는 것 입니다.

입력받은 String 값을 임시로 만든 txt에 write 하고 그 파일을 업로드 하는 방식으로

구현 하였습니다.

그럼 방법을 알아보도록 하죠.

 

FTP 파일 업로드를 구현하기 위해서는 commons-net 의 의존성을 주입해주어야 합니다.

pom.xml에 아래의 dependency를 추가해 줍니다.

 
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.3</version>
</dependency>

 

 

아래는 ftp를 연결해 파일을 업로드 하는 코드 입니다.

파일 객체와 저장파일 명을 받아서 ftp에 연결 한 후 업로드 합니다.

 
public class FtpClient {
    private String serverIp;
    private int serverPort;
    private String user;
    private String password;
    
    public FtpClient(String serverIp, int serverPort, String user, String password) {
        this.serverIp = serverIp;
        this.serverPort = serverPort;
        this.user = user;
        this.password = password;
    }
    public boolean upload(File fileObj, String 저장파일명) throws SocketException, IOException, Exception {
        FileInputStream fis = null;
        FTPClient ftpClient = new FTPClient();
        
        try {
            ftpClient.connect(serverIp, serverPort);  //ftp 연결
            ftpClient.setControlEncoding("utf-8");    //ftp 인코딩설정
            int reply = ftpClient.getReplyCode();     //응답코드받기
            
            if (!FTPReply.isPositiveCompletion(reply)) {  //응답이 false 라면 연결 해제 exception 발생
                ftpClient.disconnect();
                throw new Exception(serverIp+" FTP 서버 연결 실패");
            }
            
            ftpClient.setSoTimeout(1000 * 10);   //timeout 설정
            ftpClient.login(user, password);     //ftp 로그인
            ftpClient.changeWorkingDirectory(저장파일경로);
            ftpClient.setFileType(FTP.BINARY_FILE_TYPE); //파일타입설정
            ftpClient.enterLocalActiveMode();  //active 모드 설정
            
            fis = new FileInputStream(fileObj);
            return ftpClient.storeFile(저장파일명, fis); //파일 업로드
        } finally {
            if (ftpClient.isConnected()) {
                ftpClient.disconnect();
            }
            if (fis != null) {
                fis.close();
            }
        }
    }
}

 

주석을 잘 보이면 플로우가 이해 되실 꺼에요.

 

 

 

그럼 위의 코드를 호출 하는 부분을 보도록 하죠.

임시파일을 만들어 위의 소스를 호출하는 부분만 발최 하였습니다.

 
            File file = new File("c:\\example\\file");
            if(!file.isDirectory()){
                file.mkdirs();
            }
            /* 임시파일 생성 */
            File tempFile = File.createTempFile("temp_", ".txt", new File(Define.TEMP_DIRECTORY));
            try{
                /* 파일에 text 문자 쓰기 */
                FileWriter fw = new FileWriter(tempFile);
                BufferedWriter bw = new BufferedWriter(fw);
                bw.write(param.getInciMsgContents()); 
                bw.flush();
                bw.close();

                FtpClient fc = new FtpClient(Define.FTP_SERVER_IP, Define.FTP_SERVER_PORT, Define.FTP_ID, Define.FTP_PW);
                boolean result = fc.upload(tempFile, 파일경로+파일명.txt);
            }catch(Exception e){
                set.setResultCode(Define.INSERT_FAIL_CODE);
                set.setResultMsg(Define.INSERT_FAIL_MSG);
                e.printStackTrace();
            }

 

처음에 임시파일을 생성할 폴더를 설정하고 (없으면 생성)

createTempFile를 호출하여 임시 파일을 생성합니다.

 

파일을 생성하고 생성된 파일에 인자로 받은 param.getInciMsgContes()를 wirte하고 파일을 업로드 합니다.

 

///////////////////////////////////추가///////////////////////////////////

ftp연결 후 makeDirectory를 호출하여 폴더 생성 시 2depth가 한번에 생성되지는 않습니다.

하나씩 생성해 가셔야 합니다.

그리고 당연한 얘기지만 파일을 업로드 하는 시점에서도 changeWorkingDirectory 로 해당 경로로 이동하신 후

업로드 하셔야 원하는 위치에 제대로 파일이 업로드 됩니다.

 

예)

 

String directory1 = targetFile.split("/")[2];
String directory2 = targetFile.split("/")[3];
String fileNm = targetFile.split("/")[4];
System.out.println("업로드할 폴더 : "+directory1);
System.out.println("업로드할 폴더(하위) : "+directory2);
            
try{
    ftpClient.makeDirectory(directory1);  //root의 하위폴더 생성
    ftpClient.changeWorkingDirectory(directory1); //하위폴더로 이동
    ftpClient.makeDirectory(directory2); // 하위폴더의하위폴더 생성
}catch(Exception e){
    e.printStackTrace();
}
            
ftpClient.setSoTimeout(1000 * 10); 
ftpClient.login(user, password);
System.out.println("실제 업로드 위치 : "+directory1+"/"+directory2);
ftpClient.changeWorkingDirectory(directory1+"/"+directory2); //하위폴더의 하위폴더로 이동
ftpClient.setFileType(FTP.BINARY_FILE_TYPE); 
ftpClient.enterLocalActiveMode();

fis = new FileInputStream(fileObj);
return ftpClient.storeFile(fileNm, fis); //파일명으로 파일 업로드
반응형

댓글

💲 추천 글