利用Apache commons-net 包进行FTP文件和文件夹的上传与下载

时间:2022-07-11 21:39:46

首先声明:这段代码是我在网上胡乱找的,调试后可用。

需要提前导入jar包,我导入的是:commons-net-3.0.1,在网上可以下载到。以下为源码,其中文件夹的下载存在问题:FTPFile[] allFile = this.ftpClient.listFiles("/uploadimagefiles");  listFiles()方法总是返回为空,问题仍未解决,如有大神,还请指点。


package Ftp;   
import java.io.BufferedInputStream;  
import java.io.BufferedOutputStream;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.util.TimeZone;  
import org.apache.commons.net.ftp.FTPClient;  
import org.apache.commons.net.ftp.FTPClientConfig;  
import org.apache.commons.net.ftp.FTPFile;  
import org.apache.commons.net.ftp.FTPReply;    
import org.apache.log4j.Logger;  
  
public class Ftp {  
    private FTPClient ftpClient;  
    private String strIp;  
    private int intPort;  
    private String user;  
    private String password;  
	
    //Ftp构造函数  
    public Ftp(String strIp, int intPort, String user, String password) {  
        this.strIp = strIp;  
        this.intPort = intPort;  
        this.user = user;  
        this.password = password;  
        this.ftpClient = new FTPClient();  
    }
	
    //登录到FTP服务器,判断是否登入成功,成功返回true,不成功返回false。   
    public boolean ftpLogin() {  
        boolean isLogin = false;  
        FTPClientConfig ftpClientConfig = new FTPClientConfig();  
        ftpClientConfig.setServerTimeZoneId(TimeZone.getDefault().getID());  
        this.ftpClient.setControlEncoding("GBK");  
        this.ftpClient.configure(ftpClientConfig);  
        try {  
            if (this.intPort > 0) {  
                this.ftpClient.connect(this.strIp, this.intPort);  
            } else {  
                this.ftpClient.connect(this.strIp);  
            }  
            // FTP服务器连接回答  
            int reply = this.ftpClient.getReplyCode();  
            if (!FTPReply.isPositiveCompletion(reply)) {  
                this.ftpClient.disconnect();  
                System.out.println("登录FTP服务失败!");  
                return isLogin;  
            }  
            this.ftpClient.login(this.user, this.password);  
            // 设置传输协议  
            this.ftpClient.enterLocalPassiveMode();  
            this.ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);  
            System.out.println("用户 " + this.user + " 成功登陆FTP服务器");  
            isLogin = true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            System.out.println(this.user + "登录FTP服务失败!" + e.getMessage());  
        }  
        this.ftpClient.setBufferSize(1024 * 2);  
        this.ftpClient.setDataTimeout(30 * 1000);  
        return isLogin;  
    }  
  
     	//退出关闭服务器链接 
    public void ftpLogOut() {  
        if (null != this.ftpClient && this.ftpClient.isConnected()) {  
            try {  
                boolean reuslt = this.ftpClient.logout();// 退出FTP服务器  
                if (reuslt) {  
                    System.out.println("成功退出服务器");  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
                System.out.println("退出FTP服务器异常!" + e.getMessage());  
            } finally {  
                try {  
                    this.ftpClient.disconnect();// 关闭FTP服务器的连接  
                } catch (IOException e) {  
                    e.printStackTrace();  
                    System.out.println("关闭FTP服务器的连接异常!");  
                }  
            }  
        }  
    }  
    
   // 上传Ftp文件      @param localFile 本地文件          @param romotUpLoadePath 远程服务器路径  -  应该以/结束 
    public boolean uploadFile(File localFile, String romoteUpLoadePath) {  
        BufferedInputStream inStream = null;  
        boolean success = false;  
        try {  
            this.ftpClient.changeWorkingDirectory(romoteUpLoadePath);// 改变工作路径  
            inStream = new BufferedInputStream(new FileInputStream(localFile));  
            System.out.println(localFile.getName() + "开始上传.....");  
            long beforeTime=System.currentTimeMillis();
            success = this.ftpClient.storeFile(localFile.getName(), inStream);
            long afterTime=System.currentTimeMillis();
            if (success == true) {  
            	 double time=(afterTime-beforeTime)/1000.0;
                 double uploadSpeed=(localFile.length()/(time*1024));
                 uploadSpeed = (double)Math.round(uploadSpeed*100)/100;            	
                System.out.println(localFile.getName() + "上传成功,用时:"+time+"秒."+"平均上传速度:"+uploadSpeed+"KB/秒");                
                return success;  
            }  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
            System.out.println(localFile + "未找到");  
        } catch (IOException e) {  
            e.printStackTrace();  
        } finally {  
            if (inStream != null) {  
                try {  
                    inStream.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
        return success;  
    }  
  
    /*** 
     * 下载文件 
     * @param remoteFileName   待下载文件名称 
     * @param localDires 下载到当地那个路径下 
     * @param remoteDownLoadPath remoteFileName所在的路径 
     * */  
    public boolean downloadFile(String remoteFileName, String localDires,  
            String remoteDownLoadPath) {  
        String strFilePath = localDires + "/" + remoteFileName;  
        BufferedOutputStream outStream = null;  
        boolean success = false;  
        try {  
            this.ftpClient.changeWorkingDirectory(remoteDownLoadPath);  
            outStream = new BufferedOutputStream(new FileOutputStream(strFilePath));  
            System.out.println(remoteFileName + "开始下载....");  
            long beforeTime=System.currentTimeMillis();
            success = this.ftpClient.retrieveFile(remoteFileName, outStream);  
            long afterTime=System.currentTimeMillis();
            
            if (success == true) {  
            	double time=(afterTime-beforeTime)/1000.0;
            	File file=new File(strFilePath);
            	long length=file.length();
                double downloadSpeed=(length/(time*1024));
                downloadSpeed = (double)Math.round(downloadSpeed*100)/100;
                System.out.println(remoteFileName + "成功下载到" + strFilePath+"用时"+time+"秒."+"平均下载速度:"+downloadSpeed+"KB/秒");  
                return success;  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
            System.out.println(remoteFileName + "下载失败");  
        } finally {  
            if (null != outStream) {  
                try {  
                    outStream.flush();  
                    outStream.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
        if (success == false) {  
            System.out.println(remoteFileName + "下载失败!!!");  
        }  
        return success;  
    }  
  
    /*** 
     * @上传文件夹 
     * @param localDirectory 
     *            当地文件夹 
     * @param remoteDirectoryPath 
     *            Ftp 服务器路径 以目录"/"结束 
     * */  
    public boolean uploadDirectory(String localDirectory,  
            String remoteDirectoryPath) {  
        File src = new File(localDirectory);  
        try {  
            remoteDirectoryPath = remoteDirectoryPath + src.getName() + "/";  
            this.ftpClient.makeDirectory(remoteDirectoryPath);  
            // ftpClient.listDirectories();  
        } catch (IOException e) {  
            e.printStackTrace();  
            System.out.println(remoteDirectoryPath + "目录创建失败");  
        }  
        File[] allFile = src.listFiles();  
        for (int currentFile = 0; currentFile < allFile.length; currentFile++) {  
            if (!allFile[currentFile].isDirectory()) {  
                String srcName = allFile[currentFile].getPath().toString();  
                uploadFile(new File(srcName), remoteDirectoryPath);  
            }  
        }  
        for (int currentFile = 0; currentFile < allFile.length; currentFile++) {  
            if (allFile[currentFile].isDirectory()) {  
                // 递归  
                uploadDirectory(allFile[currentFile].getPath().toString(),  
                        remoteDirectoryPath);  
            }  
        }  
        return true;  
    }  
  
    /*** 
     * @下载文件夹 
     * @param localDirectoryPath本地地址 
     * @param remoteDirectory 远程文件夹 
     * */  
    public boolean downLoadDirectory(String localDirectoryPath,String remoteDirectory) {  
        try {  
            String fileName = new File(remoteDirectory).getName();  
            localDirectoryPath = localDirectoryPath + "/"+ fileName + "/";  
            new File(localDirectoryPath).mkdirs();  
            ftpClient.enterLocalPassiveMode(); 
            FTPFile[] allFile = this.ftpClient.listFiles("/uploadimagefiles");
            for (int currentFile = 0; currentFile < allFile.length; currentFile++) {  
                if (!allFile[currentFile].isDirectory()) {  
                    downloadFile(allFile[currentFile].getName(),localDirectoryPath, remoteDirectory);  
                }  
            }  
            for (int currentFile = 0; currentFile < allFile.length; currentFile++) {  
                if (allFile[currentFile].isDirectory()) {  
                    String strremoteDirectoryPath = remoteDirectory + "/"+ allFile[currentFile].getName();  
                    downLoadDirectory(localDirectoryPath,strremoteDirectoryPath);  
                }  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
            System.out.println("下载文件夹失败");  
            return false;  
        }  
        return true;  
    }  
    // FtpClient的Set 和 Get 函数  
    public FTPClient getFtpClient() {  
        return ftpClient;  
    }  
    public void setFtpClient(FTPClient ftpClient) {  
        this.ftpClient = ftpClient;  
    }  
      
    public static void main(String[] args) throws IOException {  
     //   Ftp ftp=new Ftp("172.19.211.0",21,"Vincent","wanghe");  
    //    ftp.ftpLogin();  
        //上传文件夹  
        //ftp.uploadDirectory("e://a1", "/");  
        //下载文件夹  
      //  ftp.downLoadDirectory("d://shixizkr", "/uploadimagefiles/"); 
      // File file = new File("e://余罪.mp4");
       //ftp.uploadFile(file, "/uploadimagefiles");
    //   ftp.downloadFile("余罪.mp4", "e://a1", "/uploadimagefiles");
       // ftp.ftpLogOut();          
    }  
}