public class FtpUtil {
private static Logger logger = LoggerFactory.getLogger(FtpUtil.class);
/**
* 获取FTPClient对象
*
* @param ftpHost FTP主机服务器
* @param ftpPassword FTP 登录密码
* @param ftpUserName FTP登录用户名
* @param ftpPort FTP端口 默认为21
* @return
*/
public static FTPClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {
FTPClient ftpClient = new FTPClient();
try {
ftpClient = new FTPClient();
ftpClient.connect(ftpHost, ftpPort);// 连接FTP服务器
ftpClient.login(ftpUserName, ftpPassword);// 登陆FTP服务器
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
ftpClient.disconnect();
logger.error("未连接到FTP,用户名或密码错误。");
} else {
logger.info("FTP connection success");
}
} catch (SocketException e) {
e.printStackTrace();
logger.error("FTP的IP地址可能错误,请正确配置。");
} catch (IOException e) {
e.printStackTrace();
logger.error("FTP的IP地址可能错误,请正确配置。");
}
return ftpClient;
}
/*
* 从FTP服务器获取文件
*
* @param ftpHost FTP IP地址
* @param ftpUserName FTP 用户名
* @param ftpPassword FTP用户名密码
* @param ftpPort FTP端口
* @param ftpPath FTP服务器中文件所在路径 格式: /ftptest/aa.pdf
*/
public byte[] getFtpFileBytes(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort, String ftpPath) {
FTPClient ftpClient = null;
try {
ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
ftpClient.setControlEncoding("UTF-8"); // 中文支持
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 使用二进制保存方式
/*
* 这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。
* 为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,
* 但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。
*/
ftpClient.enterLocalPassiveMode();
InputStream inputStream = ftpClient.retrieveFileStream(ftpPath);
if(null == inputStream) {
logger.error("没有找到" + ftpPath + "文件");
}
byte[] bytes = IOUtils.toByteArray(inputStream);
inputStream.close();
ftpClient.logout();
return bytes;
} catch (FileNotFoundException e) {
e.printStackTrace();
logger.error("没有找到" + ftpPath + "文件");
} catch (SocketException e) {
e.printStackTrace();
logger.error("连接FTP失败.");
} catch (IOException e) {
e.printStackTrace();
logger.error("文件读取错误。");
}
return null;
}
/*
* 从FTP服务器下载文件
*
* @param ftpHost FTP IP地址
* @param ftpUserName FTP 用户名
* @param ftpPassword FTP用户名密码
* @param ftpPort FTP端口
* @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa
* @param localPath 下载到本地的位置 格式:H:/download
* @param fileName 文件名称
*/
public void downloadFtpFile(String ftpHost, String ftpUserName,
String ftpPassword, int ftpPort, String ftpPath, String localPath,
String fileName) {
FTPClient ftpClient = null;
try {
ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
ftpClient.setControlEncoding("UTF-8"); // 中文支持
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 使用二进制保存方式
ftpClient.enterLocalPassiveMode();
ftpClient.changeWorkingDirectory(ftpPath);
File localFile = new File(localPath + File.separatorChar + fileName);
OutputStream os = new FileOutputStream(localFile);
ftpClient.retrieveFile(fileName, os);
os.close();
ftpClient.logout();
}catch (FileNotFoundException e) {
logger.error("没有找到" + fileName + "文件");
} catch (SocketException e) {
logger.error("连接FTP失败.");
} catch (IOException e) {
logger.error("文件读取错误。");
}
}
/**
* Description: 向FTP服务器上传文件
* @param ftpHost FTP服务器hostname
* @param ftpUserName 账号
* @param ftpPassword 密码
* @param ftpPort 端口
* @param ftpPath FTP服务器中文件所在路径 格式: ftptest/aa
* @param fileName ftp文件名称
* @param input 文件流
* @return 成功返回true,否则返回false
*/
public boolean uploadFile(String ftpHost, String ftpUserName,
String ftpPassword, int ftpPort, String ftpPath,
String fileName,InputStream input) {
boolean success = false;
FTPClient ftpClient = null;
try {
int reply;
ftpClient = getFTPClient(ftpHost, ftpUserName, ftpPassword, ftpPort);
reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
return success;
}
ftpClient.setControlEncoding("UTF-8"); // 中文支持
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); // 使用二进制保存方式
ftpClient.enterLocalPassiveMode();
ftpClient.changeWorkingDirectory(ftpPath);
ftpClient.storeFile(fileName, input);
input.close();
ftpClient.logout();
success = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
}
java FTP连接,文件上传下载工具类
最新推荐文章于 2024-08-13 18:32:02 发布