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;
}
}
Java工具之FtpUtils
最新推荐文章于 2023-05-24 14:12:45 发布