Java工具之FtpUtils

package utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;

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

public class FtpUtil
{
    /**
     * 连接ftp服务器 获取连接对象
     * 功能详细描述
     * @param host
     * @param port
     * @param userName
     * @param password
     * @return
     * @remark create wwx716383 2019年7月18日 需求编号_需求名称
     */
    public static FTPClient getFtpClient(String host,int port,String userName,String password,String character){
        FTPClient ftpClient = new FTPClient();
        ftpClient.setControlEncoding(character);
        try {
            System.out.println("connecting...ftp服务器:" + host + ":" + port);
            ftpClient.connect(host, port); //连接ftp服务器
            ftpClient.login(userName, password); //登录ftp服务器
            int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
            if (!FTPReply.isPositiveCompletion(replyCode)) {
                System.out.println("connect failed...ftp服务器:" + host + ":" + port);
                return null;
            }else{
                System.out.println("connect successful...ftp服务器:" + host + ":" + port);
                //避免忘了开启被动模式
                ftpClient.enterLocalPassiveMode();
                return ftpClient;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 下载文件  下载的文件名同
     * 功能详细描述
     * @param ftpClient 
     * @param filePath  ftp端目录
     * @param fileName  ftp端文件名
     * @param loalPath  本地下载目录  不包括文件名
     * @param loalPath  本地下载目录  不包括文件名
     * @return disconnectAfterDownload 下载完是否关闭ftp连接
     * @throws IOException 
     * @remark create wwx716383 2019年7月18日 需求编号_需求名称
     */
    /*
     * 项目中使用commons-net-3.0.1.jar实现FTP文件的下载,在windows xp上运行正常,但是放到linux上,却出现问题,
     * 程序运行到 FTPClient.listFiles()或者FTPClient.retrieveFile()方法时,就停止在那里,什么反应都没有,出现假死状态。
     * google一把,发现很多人也出现了此类问题,最终在一个帖子里找到了解决办法。在调用这两个方法之前,调用FTPClient.enterLocalPassiveMode();
     * 这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,
     * 但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。OK,问题解决。
     */
    public static Map<String, String> downloadFile(FTPClient ftpClient,String filePath,String fileName,String loalPath,boolean disconnectAfterDownload){
        Map<String, String> resultMap=new HashMap<>();
        resultMap.put("resultCode", "-1");
        FileOutputStream os=null;
        try
        {
            /*
             * 1 在FTP服务中,涉及到客户端和服务器端的连接,连接就会涉及到端口的打开问题;
                              * 2 而端口的打开中,又涉及到主动模式和被动模式。主动模式:客户端开放端口给服务端用;被动模式:服务端开放端口给客户端用。由于很多客户端在防火墙内,
             * 开放端口给服务器端用比较困难。所以用被动模式的时候比较多。
                              * 3 如果涉及到了内网、局域网等环境时,出现FTP连接问题,也可以考虑是否是因为连接模式引起的。
             */
            ftpClient.enterLocalPassiveMode();
            //切换到文件所在目录
            ftpClient.changeWorkingDirectory(filePath);
            //获取目录下的文件对象
            FTPFile[] ftpFiles=ftpClient.listFiles(filePath);
            
            //判断该目录下是否有文件
            if(ftpFiles.length>0){
                for(FTPFile file : ftpFiles){ 
                    if(fileName.equalsIgnoreCase(file.getName())){ 
                        File localFile = new File(loalPath + "/" + file.getName()); 
                        os = new FileOutputStream(localFile); 
                        ftpClient.retrieveFile(file.getName(), os); 
                        System.out.println(file.getName());
                        resultMap.put("resultCode", "200");
                        resultMap.put("message", "下载成功!");
                        resultMap.put("downloadPath", loalPath + "/" + file.getName());
                        System.out.println("下载成功!");
                        break;
                    } 
                }
                if(resultMap.get("resultCode").equals("-1")){
                    resultMap.put("message", "ftp目录下未找到该文件,目录:"+filePath+" ,文件:"+fileName);
                }
            }else{
                resultMap.put("message", "ftp目录下文件数为0,目录:"+filePath);
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
            resultMap.put("message", "下载异常!"+e.getMessage());
            System.out.println("下载异常!"+e.getMessage());
        }
        finally
        {
            if(ftpClient.isConnected()&&disconnectAfterDownload){ 
                try{
                    ftpClient.disconnect();
                }catch(IOException e){
                    e.printStackTrace();
                }
            } 
            if(null != os){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } 
            } 
        }
        return resultMap;
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值