import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.StringTokenizer;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import com.ea.rs4.Logger;
import com.ea.rs4.utils.StringUtils;
/**
* This class is used to upload files to ftp server or get files from ftp server
*
* @author Leo.Zhou
*/
public class FtpTool {
private static final Logger LOG = new Logger(FtpTool.class.getSimpleName());
private String ip;
private int port;
private String user;
private String pwd;
private String remotePath;
FTPClient ftpClient;
/**
* Connect to server
*
* @param ip
* @param port
* @param user
* @param pwd
* @return
* @throws FtpException
*/
public boolean connectServer(String ip, int port, String user, String pwd) throws FtpException {
boolean isSuccess = false;
try {
ftpClient = new FTPClient();
ftpClient.connect(ip, port);
ftpClient.login(user, pwd);
isSuccess = true;
} catch (Exception ex) {
LOG.error("Can not connect to remote ftp server");
throw new FtpException(ex);
}
return isSuccess;
}
/**
* Create directory
*
* @param dir
* @return
* @throws FtpException
*/
private void createDir(String dir) throws FtpException {
try {
ftpClient.setFileType(FTP.ASCII_FILE_TYPE);
StringTokenizer s = new StringTokenizer(dir, "/");
s.countTokens();
String pathName = "";
while (s.hasMoreElements()) {
String currentFolder = (String) s.nextElement();
if (currentFolder == null || currentFolder.length() == 0) {
continue;
}
pathName = pathName + (pathName.equals("")?"":"/") + currentFolder;
if(!isDirExist(pathName)) {
boolean result = ftpClient.makeDirectory(pathName);
if(!result) {
throw new FtpException(String.format("Permission denied, can not create folder : %s", pathName));
}
}
}
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
} catch (IOException e1) {
throw new FtpException(e1);
}
}
/**
* Check is directory exist
*
* @param dir
* @return
* @throws FtpException
*/
private boolean isDirExist(String dir) {
if(StringUtils.isEmpty(dir)) {
return true;
}
String preFolder = null;
String lastFolder = null;
if(dir.contains("/")) {
preFolder = dir.substring(0, dir.lastIndexOf("/"));
lastFolder = dir.substring(dir.lastIndexOf("/") + 1, dir.length());
} else {
preFolder = "";
lastFolder = dir;
}
boolean flag = false;
try {
FTPFile[] ftpFileArr = null;
if(preFolder.equals("")) {
ftpFileArr = ftpClient.listFiles();
} else {
ftpFileArr = ftpClient.listFiles(preFolder);
}
LOG.debug("Files in top folder : %s", Arrays.toString(ftpFileArr));
for (FTPFile ftpFile : ftpFileArr) {
if (ftpFile.isDirectory() && ftpFile.getName().equalsIgnoreCase(lastFolder)) {
flag = true;
break;
}
}
} catch (IOException e) {
flag = false;
}
return flag;
}
/**
* Upload file to ftp server
*
* @param remotePath
* @param localPath
* @param filename
* @throws FtpException
*/
public void uploadFile(String remotePath, File localFile) throws FtpException {
try {
if (connectServer(getIp(), getPort(), getUser(), getPwd())) {
if (!isDirExist(remotePath)) {
createDir(remotePath);
}
if (remotePath.length() != 0)
ftpClient.changeWorkingDirectory(remotePath);
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
InputStream iStream = null;
try {
iStream = new FileInputStream(localFile);
boolean result = ftpClient.storeFile(localFile.getName(), iStream);
if(!result) {
LOG.error("Upload file to FTP server failed.");
throw new FtpException("Upload file failed.");
}
} finally {
if (iStream != null) {
iStream.close();
}
}
closeServer();
}
} catch (IOException ex) {
throw new FtpException("Ftp upload file error:", ex);
}
}
/**
* Delete FTP file by link
*
* @param link
* @throws FtpException
*/
public void deleteFileByLink(String link) throws FtpException{
try {
if (connectServer(getIp(), getPort(), getUser(), getPwd())) {
ftpClient.deleteFile(getRemotePath() + "/" + link);
int status = ftpClient.getReplyCode();
LOG.debug("Ftp delete info:"+ftpClient.getReplyString());
if(status == 250) {
LOG.debug("Delete file from FTP server success.");
} else {
LOG.info("Delete file from FTP server failed.FTP status : %s, link : %s", status, link);
throw new FtpException(String.format("Delete file from FTP server failed, link : %s, FTP status : %s", link, status));
}
closeServer();
}
} catch (IOException ex) {
throw new FtpException(String.format("Delete file from FTP server failed, link : %s", link));
}
}
/**
* Close ftp server connection
*
* @throws FtpException
*/
private void closeServer() throws FtpException {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
throw new FtpException(e);
}
}
}
/**
* @return
*/
public String getIp() {
return ip;
}
/**
* @return
*/
public int getPort() {
return port;
}
/**
* @return
*/
public String getPwd() {
return pwd;
}
/**
* @return
*/
public String getUser() {
return user;
}
/**
* @param string
*/
public void setIp(String string) {
ip = string;
}
/**
* @param i
*/
public void setPort(int i) {
port = i;
}
/**
* @param string
*/
public void setPwd(String string) {
pwd = string;
}
/**
* @param string
*/
public void setUser(String string) {
user = string;
}
/**
* @return
*/
public String getRemotePath() {
return remotePath;
}
/**
* @param string
*/
public void setRemotePath(String remotePath) {
this.remotePath = remotePath;
this.remotePath = this.remotePath.replace("\\", "/");
LOG.debug("Saving path in current system: %s", this.remotePath);
}
}
分享到:
相关推荐
使用apache commons-net包实现文件ftp上传
在这个"commons-net-jar包.zip"压缩包中,包含了两个版本的Apache Commons Net库:commons-net-3.3.jar和commons-net-3.4.jar。这两个版本虽然相差不大,但每个新版本通常会带来一些改进和修复,使得开发者能够更...
在`commons-net-ftp-2.0.jar`中,你可以找到一系列预定义的类和接口,如`FTPClient`、`FTPFile`、`FTPSSLConnection`等,它们为FTP操作提供了丰富的功能。`FTPClient`是核心类,负责建立和管理与FTP服务器的连接,...
标题中的“利用commons-net包实现ftp上传下载例子”是指通过Apache Commons Net库来实现FTP(File Transfer Protocol)的上传和下载功能。Apache Commons Net是Apache软件基金会开发的一个Java库,它提供了多种网络...
Apache的FTP库是Java开发中一个非常实用的工具,它主要包含了两个核心的JAR包:`commons-net-1.4.1.jar`和`jakarta-oro-2.0.8.jar`。这两个包提供了丰富的功能,允许开发者在Java应用中实现FTP(文件传输协议)的...
Apache Commons Net中的FTPClient类是FTP操作的核心,它实现了完整的FTP协议栈。FTPClient提供了各种方法,如connect()用于建立与FTP服务器的连接,login()进行用户身份验证,uploadFile()和downloadFile()用于文件...
implementation 'org.apache.commons:commons-net:3.6' // 使用最新版本替代3.3 } ``` 然后,我们需要创建一个FTP客户端实例并配置连接参数,如服务器地址、端口号、用户名和密码。以下是一个简单的FTP连接示例: ...
总结起来,通过使用Apache Commons Net.jar,我们可以轻松地创建一个FTP工具类,实现FTP连接、文件上传和下载等操作。这个库不仅简化了网络编程的复杂性,还提供了稳定和高效的FTP客户端实现。在实际项目中,这样的...
1. **FTP协议支持**:Apache Commons Net提供了全面的FTP客户端实现,涵盖了FTP协议的各种功能,如连接、登录、目录浏览、文件传输(PUT和GET)、断点续传、被动模式等。这使得开发人员无需深入了解FTP协议的细节,...
3. **commons-net-examples-3.6.jar**:包含了一些示例代码,演示了如何使用Apache Commons Net库的各种功能。这些例子是学习和快速上手的良好起点,可以帮助开发者快速理解和应用库中的函数。 此外,压缩包中还有...
本文将深入解析`commons-net-3.6.jar`包,了解其核心功能、使用方法以及在实际开发中的应用。 Apache Commons Net库自1999年以来就一直在为Java开发者提供服务,它的主要目标是提供一套全面且易于使用的API,用于...
apache-jakarta旗下的所有开源...apache-jakarta-commons-net-ftp.jar apache-jakarta-oro.jar apache-jakarta-oro-2.0.8.jar commons-io-2.1-bin commons-logging-1.1.1-bin commons-modeler-2.0.1 commons-net-1.4.1
Apache Commons是一个非常有用的工具包,解决各种实际的通用问题。(附件中提供了该工具包的jar包,及源文件以供研究) BeanUtils Commons-BeanUtils 提供对 Java 反射和自省API的包装 Betwixt Betwixt提供将 ...
Apache Commons Net提供了丰富的类和方法,使得开发者可以方便地执行FTP任务,如上传、下载文件,创建、删除目录,以及管理文件权限等。 **FTPClient类** 是这个库中的核心,它实现了FTP协议的大部分功能。首先,你...
包含commons-net-3.4.jar,commons-net-3.4-sources.jar,commons-net-examples-3.4.jar包,ftp上传主要依靠commons-net-3.4.jar
Apache Commons Net 1.4.1提供了一个全面的Java实现,支持FTP的各种操作,包括上传、下载、列出目录、创建和删除文件等。这个库不仅简化了FTP交互,还处理了许多底层的网络细节,如连接管理和错误处理,使得开发者...
Apache Commons Net库是Apache软件基金会的一个项目,它提供了一系列Java类和方法来处理各种网络协议,包括FTP、FTPS、TFTP、Telnet、NNTP、SMTP等。在FTP方面,这个库提供了丰富的功能,如创建、删除、移动文件,...
在`commons-net-3.3.jar`中,FTPClient类是核心,它实现了完整的FTP协议。开发者可以通过创建FTPClient实例,然后连接到FTP服务器,进行登录、设置传输模式(ASCII或BINARY)、改变工作目录、上传和下载文件等一系列...
这个库在不同的版本中提供了各种功能的增强和优化,比如`commons-net-3.1.jar`, `commons-net-3.3.jar`, 和 `commons-net-3.6.jar`。下面将详细阐述这些版本中涉及的主要知识点: 1. **FTP(文件传输协议)支持**:...
使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...