잊지 않겠습니다.

지금 저는 Gradle을 이용한 web application 배포시에 FTP를 사용하고 있습니다.

그런데, 이 부분에 조금 문제가 있는 것이… 기존 gradle의 ant ftp module의 경우 가끔씩 hang이 걸려서 FTP upload를 실패하는 경우가 왕왕 보입니다. 그리고 FTP upload 시에 아무런 로그가 표시되지 않고, hang이 걸려버려서 정상적으로 upload가 되고 있는지에 대한 확인이 불가능했습니다.

그래서, FTPClient를 이용해서 File upload를 한번 만들어봤습니다.

기본적으로 commons-net의 FTPClient를 이용해서 처리합니다. 먼저 buildscript에 common-net을 등록시킵니다.

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'commons-net:commons-net:3.3'
        classpath 'commons-io:commons-io:2.4'
    }
}

다음은 FTPClient를 이용한 upload code입니다. groovy 스러운 문법은 전 아직 잘 안되더군요.;;


import java.io.File
import java.io.FileInputStream
import java.io.IOException
import java.io.InputStream
import java.io.PrintWriter
import org.apache.commons.net.PrintCommandListener
import org.apache.commons.net.ftp.FTP
import org.apache.commons.net.ftp.FTPClient
import org.apache.commons.net.ftp.FTPReply
import org.apache.commons.io.IOUtils


void ftpUpload(ftpUrl, ftpUsername, ftpPassword, targetPath) {
    def ftp = new FTPClient()
    ftp.connect(ftpUrl)
    int reply = ftp.getReplyCode()
    if(!FTPReply.isPositiveCompletion(reply)) {
        ftp.disconnect()
        throw new Exception("Exception in connecting to FTP Server")
    }
    ftp.login(ftpUsername, ftpPassword)
    ftp.setFileType(FTP.BINARY_FILE_TYPE)
    ftp.changeWorkingDirectory(targetPath)
    for(File f : file(getDistPath()).listFiles()) {
        upload(f, ftp)
    }
    ftp.disconnect()
}

void upload(File src, FTPClient ftp) {
    if (src.isDirectory()) {
        ftp.makeDirectory(src.getName())
        ftp.changeWorkingDirectory(src.getName())
        for (File file : src.listFiles()) {
            upload(file, ftp);
        }
        ftp.changeToParentDirectory();
    }
    else {
        InputStream srcStream = null;
        try {
            def uploadCompleted = false
            while(!uploadCompleted) {
                srcStream = src.toURI().toURL().openStream()
                println 'upload : ' + src.getName()
                uploadCompleted = ftp.storeFile(src.getName(), srcStream)
                if(!uploadCompleted) {
                    println 'upload failed : retry this file ' + src.getName()
                    IOUtils.closeQuietly(uploadCompleted)
                }
            }
        } catch(Exception ex) {
            println ex.getMessage()
        }
        finally {
            IOUtils.closeQuietly(srcStream);
        }
    }
}

java 코드 같은 느낌입니다. groovy를 사용하고 있으면 좀 더 groovy 스러운 코드여야지 될 것 같은데요. ^^;;


저작자 표시 동일 조건 변경 허락
신고
Posted by xyzlast Y2K


티스토리 툴바