從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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM