Ftp上传文件

package net.util.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPSClient;

/**
 * need commons-net-3.5.jar
 */
public class FtpHelper {

    private String host;//ip地址
    private Integer port;//端口号
    private String userName;//用户名
    private String pwd;//密码
    //private String homePath;//aaa路径
    private String charSet = "utf-8";
    // 默认超时, 毫秒
    private long timeout = 30*1000;

    public FTPClient ftpClient = null;

    public FtpHelper(){
        init();
    }
    public FtpHelper(boolean ftps){
        init(ftps);
    }

    /**
     * ftp 初始化
     */
    public void init(){
        init(false);
    }
    public void init(boolean ftps){
        close();
        if(ftps==true){
            ftpClient = new FTPSClient(true);
        }
        else{
            ftpClient=new FTPClient();
        }

        // 默认编码
        ftpClient.setControlEncoding(charSet);

        //ftpClient.setBufferSize(524288);
        //ftpClient.enterLocalPassiveMode();
        // 毫秒计时
        ftpClient.setDefaultTimeout((int) timeout);
        ftpClient.setConnectTimeout((int) timeout);
        //ftpClient.setSoTimeout((int) timeout);
        //ftpClient.setDataTimeout(timeout);
    }

    /**
     * 获取ftp连接
     * @return
     * @throws Exception
     */
    public boolean connect(String host, Integer port, String userName, String pwd) throws Exception{
        this.host = host;
        this.port = port;
        this.userName= userName;
        this.pwd = pwd;
        return connect();
    }
    public boolean connect() throws Exception{
        boolean flag=false;
        int reply;
        if (port==null) {
            ftpClient.connect(host,21);
        }else{
            ftpClient.connect(host, port);
        }

        flag = ftpClient.login(userName, pwd);
        if(flag==false)
            return flag;

        // 服务器是否响应
        reply = ftpClient.getReplyCode();
        if (FTPReply.isPositiveCompletion(reply)==false) {
            flag = false;
            ftpClient.disconnect();
            return flag;
        }

        // 默认文件格式
        ftpClient.setFileTransferMode(FTPClient.BINARY_FILE_TYPE);
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

        return flag;
    }

    /**
     * 关闭ftp连接
     */
    public void close(){
        if (ftpClient==null || ftpClient.isConnected()==false) {
            ftpClient = null;
            return;
        }
        try {
            ftpClient.logout();
            ftpClient.disconnect();
        } catch (IOException e) {
            LogHelper.logger.warn("",e);
        }
        ftpClient = null;
    }


    /*
     * ftp 多种开关函数
     */
    public FTPClient getClient(){
        return ftpClient;
    }
    public void setControlEncoding(String encoding) {
        this.charSet = encoding;
        ftpClient.setControlEncoding(encoding);
    }
    public void enterLocalPassiveMode(){
        ftpClient.enterLocalPassiveMode();
    }
    public void enterLocalActiveMode(){
        ftpClient.enterLocalActiveMode();
    }
    // 毫秒计时
    public void setDefaultTimeout(int timeout) {
        ftpClient.setDefaultTimeout(timeout);
    }
    // 毫秒计时
//    public void setConnectTimeout(int connectTimeout) {
//        ftpClient.setConnectTimeout(connectTimeout);
//    }
    // 毫秒计时
    public void setDataTimeout(int timeout) {
        ftpClient.setDataTimeout(timeout);
    }
    public void setBufferSize(int bufSize) {
        ftpClient.setBufferSize(bufSize);
    }
    /**
     * 传输格式
     * @param mode: FTPClient.BINARY_FILE_TYPE
     * @return
     * @throws IOException 
     */
    public boolean setFileTransferMode(int mode) throws IOException{
        return ftpClient.setFileTransferMode(mode);
    }
    /**
     * 文件格式
     * @param mode: FTPClient.BINARY_FILE_TYPE
     * @return
     * @throws IOException
     */
    public boolean setFileType(int mode) throws IOException {
        return ftpClient.setFileType(mode);

    }
    /*
     * ftp 多种开关函数
     */


    /**
     * ftp创建目录
     * @param path
     * @return
     * @throws IOException
     */
    public boolean createDir(String path) throws IOException{
        boolean bl = false;
        String pwd = "/";
        try {
            pwd = ftpClient.printWorkingDirectory();
        } catch (IOException e) {
            LogHelper.logger.warn("",e);
        }
        if(path.endsWith("/")==false){
            path = path + "/";
        }
        int fromIndex = 0;
        while(true){
            int start = path.indexOf("/", fromIndex);
            if(start<0)
                break;
            fromIndex = start;
            String curPath = path.substring(0, fromIndex+1);
            //System.out.println(curPath);
            bl = ftpClient.changeWorkingDirectory(curPath);
            if(bl==false){
                bl = ftpClient.makeDirectory(curPath);
            }
            if(bl==false)
                break;
            fromIndex = fromIndex + 1;
        }
        ftpClient.changeWorkingDirectory(pwd);
        return bl;
    }

    /**
     * ftp上传文件或文件夹
     * @param srcPath: 本地目录或文件
     * @param dstPath: ftp目录或文件
     * @throws Exception
     */
    public void upload(String localPath, String ftpPath) throws Exception{
        File file = new File(localPath);
        if (file.isDirectory()) {
            createDir(ftpPath);
            String[] files=file.list();
            for(String fileName : files){
                String subLocalPath = PathUtil.CombineUrl(localPath, fileName);
                String subFtpPath = PathUtil.CombineUrl(ftpPath, fileName);
                upload(subLocalPath, subFtpPath);
            }
        }
        else{
            FileInputStream localInput = null;
            try {
                //ftpClient.enterLocalPassiveMode();
                String dirPath = new File(ftpPath).getParent();
                dirPath = dirPath.replace("\\", "/");
                createDir(dirPath);
                localInput = new FileInputStream(file);
                if(ftpClient.storeFile(ftpPath, localInput)==false){
                    LogHelper.logger.error("ftp upload file error: "+localPath);
                }
            }
            catch (Exception e) {
                LogHelper.logger.warn("",e);
            }
            finally{
                try {
                    if(localInput!=null)
                        localInput.close();
                } catch (Exception e) {}
            }
        }
    }
    /**
     * ftp单文件上传
     * @param localPath
     * @param ftpPath
     * @return
     */
    public boolean uploadFile(String localPath, String ftpPath){
        boolean bl = false;
        File file = new File(localPath);
        if (file.isFile()) {
            FileInputStream localInput = null;
            try {
                //String tmpPath = ftpPath + ".tmp";
                //ftpClient.enterLocalPassiveMode();
                String dirPath = new File(ftpPath).getParent();
                dirPath = dirPath.replace("\\", "/");
                createDir(dirPath);
                localInput = new FileInputStream(file);
                if(ftpClient.storeFile(ftpPath, localInput)==false){
                    bl = false;
                    LogHelper.logger.error("ftp upload file error: "+localPath);
                }
                else{
                    //bl = ftpClient.rename(tmpPath, ftpPath);
                    bl = true;
                }
            }
            catch (Exception e) {
                LogHelper.logger.warn("",e);
            }
            finally{
                try {
                    if(localInput!=null)
                        localInput.close();
                } catch (Exception e) {}
            }
        }
        return bl;
    }

    /**
     * ftp下载文件或目录
     * @param ftpPath: ftp远程目录或文件
     * @param localPath: 本地保存目录或文件
     * @param isFile: ftppath是文件或目录
     * @throws Exception
     */
    public void down(String ftpPath, String localPath, boolean isFile) throws Exception{
        if(isFile==true){
            FileOutputStream localFos = null;
            try {
                //ftpClient.enterLocalPassiveMode();
                String dirPath = new File(localPath).getParent();
                FileUtil.createDir(dirPath);
                File file = new File(localPath);
                localFos = new FileOutputStream(file);
                if(ftpClient.retrieveFile(ftpPath, localFos)==false){
                    LogHelper.logger.error("ftp down file error: "+ftpPath);
                }
            }
            catch (Exception e) {
                LogHelper.logger.warn("",e);
            }
            finally{
                try {
                    if(localFos!=null)
                        localFos.close();
                } catch (Exception e) {}
            }
        }
        // 目录处理
        else{
            FileUtil.createDir(localPath);
            FTPFile[] ftpFiles = ftpClient.listFiles(ftpPath);
            for (int j=0; j<ftpFiles.length; j++) {
                FTPFile ftpFile = ftpFiles[j];
                String subFtpPath = PathUtil.CombineUrl(ftpPath, ftpFile.getName());
                String subLocalPath = PathUtil.CombineUrl(localPath, ftpFile.getName());
                if(ftpFile.isFile()==true){
                    down(subFtpPath, subLocalPath, true);
                }
                else{
                    down(subFtpPath, subLocalPath, false);
                }
            }
        }
    }
    /**
     * ftp单文件下载
     * @param ftpPath
     * @param localPath
     * @return
     */
    public boolean downFile(String ftpPath, String localPath) {
        boolean bl = false;
        FileOutputStream localFos = null;
        try {
            //ftpClient.enterLocalPassiveMode();
            FileUtil.createDir(localPath, true);
            File file = new File(localPath);
            localFos = new FileOutputStream(file);
            if(ftpClient.retrieveFile(ftpPath, localFos)==false){
                LogHelper.logger.error("ftp down file error: "+ftpPath);
            }
            else{
                bl = true;
            }
        }
        catch (Exception e) {
            LogHelper.logger.warn("",e);
        }
        finally{
            try {
                if(localFos!=null)
                    localFos.close();
            } catch (Exception e) {}
        }
        return bl;
    }


    /**
     * 判断路径是否为ftp文件
     * @param ftpPath
     * @return
     * @throws IOException
     */
    public boolean isFile(String ftpPath) throws IOException{
        if(ftpPath==null || ftpPath.endsWith("/"))
            return false;
        File f = new File(ftpPath);
        String lastName = f.getName();
        String parentDir = f.getParent();
        // 根目录没有上层目录
        if(parentDir==null)
            return false;
        FTPFile[] ftpFiles = ftpClient.listFiles(parentDir);
        for (int j=0; j<ftpFiles.length; j++) {
            FTPFile ftpFile = ftpFiles[j];
            if(ftpFile.isFile()==true && lastName.equals(ftpFile.getName())){
                return true;
            }
        }
        return false;
    }
    /**
     * 判断路径是否为ftp目录
     * @param ftpPath
     * @return
     * @throws IOException
     */
    public boolean isDir(String ftpPath) throws IOException{
        if(ftpPath==null)
            return false;
        File f = new File(ftpPath);
        String lastName = f.getName();
        String parentDir = f.getParent();
        // 根目录没有上层目录
        if(parentDir==null)
            return true;
        FTPFile[] ftpFiles = ftpClient.listFiles(parentDir);
        for (int j=0; j<ftpFiles.length; j++) {
            FTPFile ftpFile = ftpFiles[j];
            if(ftpFile.isDirectory()==true && lastName.equals(ftpFile.getName())){
                return true;
            }
        }
        return false;
    }
    public boolean isDirB(String ftpPath) {
        String cwd = "/";
        try {
            cwd = ftpClient.printWorkingDirectory();
        } catch (IOException e) {
            LogHelper.logger.warn("",e);
        }
        try {
            boolean isDir = ftpClient.changeWorkingDirectory(ftpPath);
            ftpClient.changeWorkingDirectory(cwd);
            return isDir;
        }catch (IOException e) {}
        return false;
    }

    /**
     * 返回指定目录文件列表(包括子目录)
     * @param ftpPath: ftp文件夹目录, 不能传文件
     * @return
     * @throws Exception
     */
    public List<String> listFtpFiles(String ftpPath) throws Exception{
        List<String> list = new ArrayList<String>();
        FTPFile[] ftpFiles = ftpClient.listFiles(ftpPath);
        for (int j=0; j<ftpFiles.length; j++) {
            FTPFile ftpFile = ftpFiles[j];
            String subFtpPath = PathUtil.CombineUrl(ftpPath, ftpFile.getName());
            if(ftpFile.isFile()==true){
                list.add(subFtpPath);
            }
            else{
                List<String> subList = listFtpFiles(subFtpPath);
                list.addAll(subList);
            }
        }
        return list;
    }
    /**
     * 返回当前目录文件列表
     * @param ftpPath
     * @return
     * @throws IOException
     */
    public FTPFile[] listFiles(String ftpPath) throws IOException{
        return ftpClient.listFiles(ftpPath);
    }
    /**
     * ftp修改文件名
     * @param from
     * @param to
     * @return
     */
    public boolean rename(String from, String to){
        boolean bl = false;
        try {
            bl = ftpClient.rename(from, to);
        } catch (IOException e) {
            LogHelper.logger.warn("",e);
        }
        return bl;
    }
    /**
     * 删除文件
     * @param ftpPath
     * @return
     */
    public boolean deleteFile(String ftpPath){
        boolean bl = false;
        try {
            bl = ftpClient.deleteFile(ftpPath);
        } catch (IOException e) {
            LogHelper.logger.warn("",e);
        }
        return bl;
    }


    public void test() throws Exception{
        //down("/tt/ss/msgutil.zip.tmp", "/root/Desktop/tmp/", true);
        down("/tt", "/root/Desktop/tmp/", false);
        ftpClient.rename("from", "to");
        FTPFile[] files = ftpClient.listFiles("");
        for(FTPFile ff : files){
            System.out.println(ff.getName());
            System.out.println(ff.getLink());
        }
        System.out.println(files);
    }

    // test
    public static void main(String[] args) throws Exception {

        //FtpHelper fh = new FtpHelper("192.169.126.100",21,"yfsb","inet-eyed20");
        FtpHelper fh = new FtpHelper();
        boolean bl = fh.connect("172.16.9.101",21,"test1","111");
        System.out.println("connect: "+bl);

        List<String> list = fh.listFtpFiles("/");
        fh.uploadFile("C:/Users/wang/Desktop/testftp/tiedel.zip", "/tiedel.zip.tmp");
        fh.deleteFile("/tiedel.zip");
        bl = fh.rename("/tiedel.zip.tmp", "/tiedel.zip");
        bl = fh.isFile("/33");
        bl = fh.isDir("/tiedel.zip");
        //fh.down("/p1/fp", "C:/Users/wang/Desktop/testftp22/tmp", false);
        //fh.test();
        //bl = fh.createDir("/p1/p2/p3/p4/p5");
        //fh.upload("/root/Desktop/friendxml0.txt");
        //fh.upload("/root/Desktop/123", "/tt/ss2/");
        System.out.println(bl);
    }


}

 

posted @ 2017-08-23 17:11  削肾客  阅读(798)  评论(0编辑  收藏  举报