FTPUtils工具类

时间:2019-02-16
本文章向大家介绍FTPUtils工具类,主要包括FTPUtils工具类使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

/**
 * ftp工具类
 * 
 * @author A雄
 *
 */
public class FtpUtil {

    private final static Log logger = LogFactory.getLog(FtpUtil.class);

    /**
     * 获取FTPClient对象
     *
     * @param ftpHost     FTP主机服务器
     * @param ftpPassword FTP 登录密码
     * @param ftpUserName FTP登录用户名
     * @param ftpPort     FTP端口 默认为21
     * @return
     */
    private static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {
        FTPClient ftpClient = new FTPClient();
        try {
            ftpClient = new FTPClient();
            // 连接FTP服务器
            ftpClient.connect(ftpHost, ftpPort);
            // 登陆FTP服务器
            ftpClient.login(ftpUserName, ftpPassword);
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                logger.info("未连接到FTP,用户名或密码错误。");
                ftpClient.disconnect();
            } else {
                logger.info("FTP连接成功。");
            }
        } catch (SocketException e) {
            logger.info("FTP的IP地址可能错误,请正确配置。" + e);
        } catch (IOException e) {
            logger.info("FTP的端口错误,请正确配置。" + e);
        }
        return ftpClient;
    }

    /***
     * 从FTP服务器下载文件
     * 
     * @param ftpHost     FTP IP地址
     * @param ftpUserName FTP 用户名
     * @param ftpPassword FTP用户名密码
     * @param ftpPort     FTP端口
     * @param ftpPath     FTP服务器中文件所在路径 格式: ftptest/aa
     * @param localPath   下载到本地的位置 格式:H:/download
     * @param fileName    文件名称
     */
    public static File downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort,
            String ftpPath, String localPath, String fileName) {

        FTPClient ftpClient = null;

        try {
            ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
            // 中文支持
            ftpClient.setControlEncoding("UTF-8");
            //ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.enterLocalPassiveMode();
            ftpClient.changeWorkingDirectory(ftpPath);

            File localFile = new File(localPath , fileName);
            if (!localFile.getParentFile().exists()) {
                localFile.getParentFile().mkdirs();
            }
            OutputStream os = new FileOutputStream(localFile);
            ftpClient.retrieveFile(fileName, os);
            os.close();
            ftpClient.logout();
            return localFile;
        } catch (FileNotFoundException e) {
            logger.error("没有找到" + ftpPath + "文件," + e);
        } catch (SocketException e) {
            logger.error("连接FTP失败, " + e);
        } catch (IOException e) {
            logger.error("文件读取错误。" + e);
        }
        return null;
    }
    
    
    /***
     * 从FTP服务器下载文件
     * 
     * @param ftpHost     FTP IP地址
     * @param ftpUserName FTP 用户名
     * @param ftpPassword FTP用户名密码
     * @param ftpPort     FTP端口
     * @param ftpPath     FTP服务器中文件所在路径 格式: ftptest/aa
     * @param localPath   下载到本地的位置 格式:H:/download
     */
    public static  List<String> downloadFtpFile(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort,
            String ftpPath, String localPath) {
        FTPClient ftpClient = null;
        //InputStream is = null;
        FileOutputStream fos = null;
        OutputStream is=null;
        //String[] returnFile =null;
        List<String> list = new ArrayList<String>();
        
        try {
            ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
            // 中文支持
            ftpClient.setControlEncoding("UTF-8");
            ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
            ftpClient.enterLocalPassiveMode();
            //ftpClient.changeWorkingDirectory("/we_ali_pay_file/20180606");
            ftpClient.changeWorkingDirectory(ftpPath);
            ftpClient.enterLocalPassiveMode();
            
            FTPFile[] fs = ftpClient.listFiles(); 
            //System.out.println(fs.length);
            for (FTPFile ff : fs) { 
                //解决中文乱码问题,两次解码 
                //byte[] bytes=ff.getName().getBytes("iso-8859-1"); 
                //String fn=new String(bytes,"utf8");
                File localFile = new File(localPath +"\\"+ ff.getName());
                localFile.toString();
                list.add(localFile.toString());
                //System.out.println("文件创建路径为:"+localFile);
                if (!localFile.getParentFile().exists()) {
                    localFile.getParentFile().mkdirs();
                }
                 is = new FileOutputStream(localFile);
                ftpClient.retrieveFile(ff.getName(), is);
               }
            ftpClient.logout();
        } catch (Exception e) {
            logger.error("FTP文件下载失败!", e);
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                }
                if (is != null) {
                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return list;
    }
    public static void main(String[] args) {
//        getFTPClient("192.168.*.*", "**", "**", 21);
        downloadFtpFile("192.168.*.*", "**", "*", 21, "ftp://192.168.*.*", "D:/LYGSEFTPDownload", "BAS20181201MX000110751010007");
    }

}