从ftp服务器下载文件到本地

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FtpTools {

      private final static String ftphostaddr = "127.0.0.1";//服务器地址
        private final static String ftppath = "E:\\ftp_data";//操作的服务器目录
        private final static String ftpname = "Administrator";//服务器登录名
        private final static String ftppwd = "ytd123456";//登录密码
        private final static String localpath = "E:\\dt_data";
        private final static String fileSeparator = System.getProperty("file.separator");
         
        private static final Logger logger = LoggerFactory.getLogger(FtpTools.class);
         
        public static void main(String[] args) {
            FtpTools tools = new FtpTools();
            tools.downFile("RDClass.java");
        }
         
        /**
         * 从文件服务器上下载文件到本地
         * @param filename
         */
         public static void downFile(String filename) {
             FTPClient ftp = initFtp();
             try{
                    //4.指定要下载的目录 
                    ftp.changeWorkingDirectory(ftppath);// 转移到FTP服务器目录 
                    //5.遍历下载的目录 
                    FTPFile[] fs = ftp.listFiles(); 
                    for (FTPFile ff : fs) { 
                        //解决中文乱码问题,两次解码 
                        byte[] bytes=ff.getName().getBytes("iso-8859-1"); 
                        String fn=new String(bytes,"utf8");
                        if (fn.equals(filename)) { 
                            //6.写操作,将其写入到本地文件中 
                           logger.info("下载文件:"+filename+"开始:"+System.currentTimeMillis());
                            File localFile = new File(localpath +fileSeparator+ ff.getName()); 
                            OutputStream is = new FileOutputStream(localFile); 
                            ftp.retrieveFile(ff.getName(), is);
                             
                            //7.判断本地文件是否正确写入,如果正确写入,将文件服务器上的文件删除(这步一般不用操作,为啥要删除服务器上面的文件呢)
                            if(localFile.exists()){
                                logger.info("删除服务器上文件:"+filename);
                                ftp.deleteFile(ff.getName());
                            }
                            logger.info("下载文件:"+filename+"结束:"+System.currentTimeMillis());
                            is.close(); 
                        } 
                    } 
                    ftp.logout(); 
             }catch(Exception e){
                 e.printStackTrace();
                 new Exception("从服务器下载文件过程中发生错误");
             }finally{
                 if (ftp.isConnected()) { 
                        try { 
                            ftp.disconnect(); 
                        } catch (IOException ioe) { 
                            ioe.printStackTrace();
                        } 
                    } 
             }
         }
          
        public static FTPClient initFtp() {
            int reply;
            FTPClient ftp = new FTPClient();
            try {
                // 1.连接服务器
                //ftp.connect(ftphostaddr);
                ftp.connect(ftphostaddr, 21);
                // 2.登录服务器 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
                ftp.login(ftpname, ftppwd);
                // 3.判断登陆是否成功
                reply = ftp.getReplyCode();
                if (!FTPReply.isPositiveCompletion(reply)) {
                    ftp.disconnect();
                }
            } catch (Exception e) {
                e.printStackTrace();
                new Exception("服务器连接失败");
            }
            return ftp;
        }
          

}
原版(参数写死)

 

    public void initDtData(fhycgz e) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String thatDate = sdf.format(e.getRq());

        String dirPath = fhycgzController.class.getClassLoader().getResource("/").getPath() + File.separator + "conf";
        Properties p = new Properties();
        try {
            p.load(new FileInputStream(dirPath + File.separator + "app.properties"));
            String addr = p.getProperty("ftp.dt.service.addr");
            String ftpPath = p.getProperty("ftp.dt.service.ftpPath");
            String name = p.getProperty("ftp.dt.service.name");
            String pwd = p.getProperty("ftp.dt.service.pwd");
            String localPath = p.getProperty("ftp.dt.service.localPath");
            String fileName = "RDClass.java";
            FtpTools.downFile(addr, name, pwd, 21, ftpPath, fileName, localPath);

            // 遍历本地所有文件,查找当天的dt文件
            File file = new File(localPath);
            File[] listFiles = file.listFiles();
            for (File f : listFiles) {
                logger.info("getName--->=" + f.getName());
                if (f.isFile() && f.getName().contains(thatDate)) {
                    this.getTdByTdName(localPath + File.separator + f.getName());
                }
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        }

    }
优化版1(从配置文件读取参数)

 

package com.ytd.ebos.platform.fhycgz.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FtpTools {

    private static final Logger logger = LoggerFactory.getLogger(FtpTools.class);

    public static void main(String[] args) {
//        FtpTools tools = new FtpTools();
//        tools.downFile("RDClass.java");
    }

    /**
     * 从文件服务器上下载文件到本地
     * 
     * @param addr 服务器地址
     * @param name 服务器登录名
     * @param pwd 登录密码
     * @param port 端口
     * @param ftpPath 操作的服务器目录
     * @param fileName 需要下载的文件名
     * @param localPath  本地存放文件的目录
     */
    public static void downFile(String addr,String name,String pwd,int port,String ftpPath,String fileName,String localPath) {
        FTPClient ftp = initFtp(addr,name,pwd,port);
        try {
            // 4.指定要下载的目录
            ftp.changeWorkingDirectory(ftpPath);// 转移到FTP服务器目录
            // 5.遍历下载的目录
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs) {
                // 解决中文乱码问题,两次解码S
                byte[] bytes = ff.getName().getBytes("iso-8859-1");
                String fn = new String(bytes, "utf8");
                if (fn.equals(fileName)) {
                    // 6.写操作,将其写入到本地文件中
                    logger.info("下载文件:" + fileName + "开始:" + System.currentTimeMillis());
                    File localFile = new File(localPath + File.separator + ff.getName());
                    OutputStream is = new FileOutputStream(localFile);
                    ftp.retrieveFile(ff.getName(), is);

                    // 7.判断本地文件是否正确写入,如果正确写入,将文件服务器上的文件删除
                    // if(localFile.exists()){
                    // logger.info("删除服务器上文件:"+filename);
                    // ftp.deleteFile(ff.getName());
                    // }
                    logger.info("下载文件:" + fileName + "结束:" + System.currentTimeMillis());
                    is.close();
                }
            }
            ftp.logout();
        } catch (Exception e) {
            e.printStackTrace();
            new Exception("从服务器下载文件过程中发生错误");
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }
    }

    public static FTPClient initFtp(String addr,String name,String pwd,int port ) {
        int reply;
        FTPClient ftp = new FTPClient();
        try {
            // 1.连接服务器
            // ftp.connect(ftphostaddr);
            ftp.connect(addr, port);
            // 2.登录服务器 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            ftp.login(name, pwd);
            // 3.判断登陆是否成功
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
            }
        } catch (Exception e) {
            e.printStackTrace();
            new Exception("服务器连接失败");
        }
        return ftp;
    }


}
优化版2(工具类)

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Properties;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FtpTools {

    private static final Logger logger = LoggerFactory.getLogger(FtpTools.class);

    public static void main(String[] args) {
//        FtpTools tools = new FtpTools();
//        tools.downFile("RDClass.java");
    }

    /**
     * 从文件服务器上下载文件到本地
     * 
     * @param addr 服务器地址
     * @param name 服务器登录名
     * @param pwd 登录密码
     * @param port 端口
     * @param ftpPath 操作的服务器目录
     * @param fileName 需要下载的文件名
     * @param localPath  本地存放文件的目录
     */
    public static void downFile(String addr,String name,String pwd,int port,String ftpPath,String fileName,String localPath) {
        FTPClient ftp = initFtp(addr,name,pwd,port);
        try {
            ftp.changeWorkingDirectory(ftpPath);// 转移到FTP服务器目录
            
            String dirPath = FtpTools.class.getClassLoader().getResource("/").getPath() + File.separator + "conf";
            Properties p = new Properties();
            p.load(new FileInputStream(dirPath + File.separator + "ebos-app.properties"));
            String encode = p.getProperty("ftp.dt.service.encoding");
            if(encode==null){
                encode="gb2312";
            }
            ftp.setControlEncoding(encode);
            
            ftp.enterLocalPassiveMode();
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);  
            // 4.指定要下载的目录
            // 5.遍历下载的目录
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs) {
                // 解决中文乱码问题,两次解码S
//                byte[] bytes = ff.getName().getBytes("iso-8859-1");
//                byte[] bytes = ff.getName().getBytes("GB2312");
                
                logger.info("getName:" +  ff.getName());
//                String fn = new String(bytes, "utf8");
                String fn = ff.getName();
                if (fn.contains(fileName)) {
                    // 6.写操作,将其写入到本地文件中
                    long start = System.currentTimeMillis();
                    logger.info("下载文件:" +  fn + "开始:" + start);
                    File localFile = new File(localPath + File.separator + fn);
                    OutputStream os = new FileOutputStream(localFile);
//                    ftp.retrieveFile(fn, os);
                    ftp.retrieveFile(new String(fn.getBytes(encode), "iso-8859-1"), os);
                    
                    // 7.判断本地文件是否正确写入,如果正确写入,将文件服务器上的文件删除
                    // if(localFile.exists()){
                    // logger.info("删除服务器上文件:"+filename);
                    // ftp.deleteFile(ff.getName());
                    // }
                    long end = System.currentTimeMillis();
                    logger.info("下载文件:" +  fn + "结束:" + end+",用时"+(end-start)/1000+"秒");
                    os.close();
                }
            }
            ftp.logout();
        } catch (Exception e) {
            new Exception("从服务器下载文件过程中发生错误"+e.getMessage());
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                    new Exception("从服务器下载文件过程中发生错误"+ioe.getMessage());
                }
            }
        }
    }

    public static FTPClient initFtp(String addr,String name,String pwd,int port ) {
        int reply;
        FTPClient ftp = new FTPClient();
        try {
            // 1.连接服务器
            // ftp.connect(ftphostaddr);
            ftp.connect(addr, port);
            // 2.登录服务器 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            ftp.login(name, pwd);
            // 3.判断登陆是否成功
            reply = ftp.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
            }
        } catch (Exception e) {
            new Exception("服务器连接失败");
        }
        return ftp;
    }


}
优化版3(工具类--解决中文无法下载的问题)

 

下载的文件名有中文时可以这样设置FTPClient的参数:

ftp.retrieveFile(new String(fn.getBytes("GB2312"), "iso-8859-1"), os);

 

posted @ 2022-03-17 19:18  爱跳舞的程序员  阅读(1455)  评论(0编辑  收藏  举报