|
|
@@ -13,6 +13,7 @@ import java.io.File;
|
|
|
import java.io.IOException;
|
|
|
import java.io.InputStream;
|
|
|
import java.io.OutputStream;
|
|
|
+import java.net.SocketException;
|
|
|
import java.nio.charset.Charset;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
@@ -20,23 +21,27 @@ import java.util.List;
|
|
|
/**
|
|
|
* FTP客户端封装<br>
|
|
|
* 此客户端基于Apache-Commons-Net
|
|
|
- *
|
|
|
+ *
|
|
|
* @author looly
|
|
|
* @since 4.1.8
|
|
|
*/
|
|
|
public class Ftp extends AbstractFtp {
|
|
|
|
|
|
- /** 默认端口 */
|
|
|
+ /**
|
|
|
+ * 默认端口
|
|
|
+ */
|
|
|
public static final int DEFAULT_PORT = 21;
|
|
|
|
|
|
private FTPClient client;
|
|
|
private FtpMode mode;
|
|
|
- /** 执行完操作是否返回当前目录 */
|
|
|
+ /**
|
|
|
+ * 执行完操作是否返回当前目录
|
|
|
+ */
|
|
|
private boolean backToPwd;
|
|
|
|
|
|
/**
|
|
|
* 构造,匿名登录
|
|
|
- *
|
|
|
+ *
|
|
|
* @param host 域名或IP
|
|
|
*/
|
|
|
public Ftp(String host) {
|
|
|
@@ -45,7 +50,7 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 构造,匿名登录
|
|
|
- *
|
|
|
+ *
|
|
|
* @param host 域名或IP
|
|
|
* @param port 端口
|
|
|
*/
|
|
|
@@ -55,10 +60,10 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 构造
|
|
|
- *
|
|
|
- * @param host 域名或IP
|
|
|
- * @param port 端口
|
|
|
- * @param user 用户名
|
|
|
+ *
|
|
|
+ * @param host 域名或IP
|
|
|
+ * @param port 端口
|
|
|
+ * @param user 用户名
|
|
|
* @param password 密码
|
|
|
*/
|
|
|
public Ftp(String host, int port, String user, String password) {
|
|
|
@@ -67,12 +72,12 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 构造
|
|
|
- *
|
|
|
- * @param host 域名或IP
|
|
|
- * @param port 端口
|
|
|
- * @param user 用户名
|
|
|
+ *
|
|
|
+ * @param host 域名或IP
|
|
|
+ * @param port 端口
|
|
|
+ * @param user 用户名
|
|
|
* @param password 密码
|
|
|
- * @param charset 编码
|
|
|
+ * @param charset 编码
|
|
|
*/
|
|
|
public Ftp(String host, int port, String user, String password, Charset charset) {
|
|
|
this(host, port, user, password, charset, null);
|
|
|
@@ -81,19 +86,25 @@ public class Ftp extends AbstractFtp {
|
|
|
/**
|
|
|
* 构造
|
|
|
*
|
|
|
- * @param host 域名或IP
|
|
|
- * @param port 端口
|
|
|
- * @param user 用户名
|
|
|
+ * @param host 域名或IP
|
|
|
+ * @param port 端口
|
|
|
+ * @param user 用户名
|
|
|
* @param password 密码
|
|
|
- * @param charset 编码
|
|
|
- * @param mode 模式
|
|
|
+ * @param charset 编码
|
|
|
+ * @param mode 模式
|
|
|
*/
|
|
|
public Ftp(String host, int port, String user, String password, Charset charset, FtpMode mode) {
|
|
|
- this.host = host;
|
|
|
- this.port = port;
|
|
|
- this.user = user;
|
|
|
- this.password = password;
|
|
|
- this.charset = charset;
|
|
|
+ this(new FtpConfig(host, port, user, password, charset), mode);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构造
|
|
|
+ *
|
|
|
+ * @param config FTP配置
|
|
|
+ * @param mode 模式
|
|
|
+ */
|
|
|
+ public Ftp(FtpConfig config, FtpMode mode) {
|
|
|
+ super(config);
|
|
|
this.mode = mode;
|
|
|
this.init();
|
|
|
}
|
|
|
@@ -104,15 +115,15 @@ public class Ftp extends AbstractFtp {
|
|
|
* @return this
|
|
|
*/
|
|
|
public Ftp init() {
|
|
|
- return this.init(this.host, this.port, this.user, this.password, this.mode);
|
|
|
+ return this.init(this.ftpConfig, this.mode);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 初始化连接
|
|
|
*
|
|
|
- * @param host 域名或IP
|
|
|
- * @param port 端口
|
|
|
- * @param user 用户名
|
|
|
+ * @param host 域名或IP
|
|
|
+ * @param port 端口
|
|
|
+ * @param user 用户名
|
|
|
* @param password 密码
|
|
|
* @return this
|
|
|
*/
|
|
|
@@ -122,22 +133,39 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 初始化连接
|
|
|
- *
|
|
|
- * @param host 域名或IP
|
|
|
- * @param port 端口
|
|
|
- * @param user 用户名
|
|
|
+ *
|
|
|
+ * @param host 域名或IP
|
|
|
+ * @param port 端口
|
|
|
+ * @param user 用户名
|
|
|
* @param password 密码
|
|
|
- * @param mode 模式
|
|
|
+ * @param mode 模式
|
|
|
* @return this
|
|
|
*/
|
|
|
public Ftp init(String host, int port, String user, String password, FtpMode mode) {
|
|
|
+ return init(new FtpConfig(host, port, user, password, this.ftpConfig.getCharset()), mode);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初始化连接
|
|
|
+ *
|
|
|
+ * @param config FTP配置
|
|
|
+ * @param mode 模式
|
|
|
+ * @return this
|
|
|
+ */
|
|
|
+ public Ftp init(FtpConfig config, FtpMode mode) {
|
|
|
final FTPClient client = new FTPClient();
|
|
|
- client.setControlEncoding(this.charset.toString());
|
|
|
+ client.setControlEncoding(config.getCharset().toString());
|
|
|
+ client.setConnectTimeout((int) config.getConnectionTimeout());
|
|
|
+ try {
|
|
|
+ client.setSoTimeout((int)config.getSoTimeout());
|
|
|
+ } catch (SocketException e) {
|
|
|
+ //ignore
|
|
|
+ }
|
|
|
try {
|
|
|
// 连接ftp服务器
|
|
|
- client.connect(host, port);
|
|
|
+ client.connect(config.getHost(), config.getPort());
|
|
|
// 登录ftp服务器
|
|
|
- client.login(user, password);
|
|
|
+ client.login(config.getUser(), config.getPassword());
|
|
|
} catch (IOException e) {
|
|
|
throw new FtpException(e);
|
|
|
}
|
|
|
@@ -148,7 +176,7 @@ public class Ftp extends AbstractFtp {
|
|
|
} catch (IOException e) {
|
|
|
// ignore
|
|
|
}
|
|
|
- throw new FtpException("Login failed for user [{}], reply code is: [{}]", user, replyCode);
|
|
|
+ throw new FtpException("Login failed for user [{}], reply code is: [{}]", config.getUser(), replyCode);
|
|
|
}
|
|
|
this.client = client;
|
|
|
if (mode != null) {
|
|
|
@@ -159,7 +187,7 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 设置FTP连接模式,可选主动和被动模式
|
|
|
- *
|
|
|
+ *
|
|
|
* @param mode 模式枚举
|
|
|
* @return this
|
|
|
* @since 4.1.19
|
|
|
@@ -167,19 +195,19 @@ public class Ftp extends AbstractFtp {
|
|
|
public Ftp setMode(FtpMode mode) {
|
|
|
this.mode = mode;
|
|
|
switch (mode) {
|
|
|
- case Active:
|
|
|
- this.client.enterLocalActiveMode();
|
|
|
- break;
|
|
|
- case Passive:
|
|
|
- this.client.enterLocalPassiveMode();
|
|
|
- break;
|
|
|
+ case Active:
|
|
|
+ this.client.enterLocalActiveMode();
|
|
|
+ break;
|
|
|
+ case Passive:
|
|
|
+ this.client.enterLocalPassiveMode();
|
|
|
+ break;
|
|
|
}
|
|
|
return this;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 设置执行完操作是否返回当前目录
|
|
|
- *
|
|
|
+ *
|
|
|
* @param backToPwd 执行完操作是否返回当前目录
|
|
|
* @return this
|
|
|
* @since 4.6.0
|
|
|
@@ -191,7 +219,7 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 如果连接超时的话,重新进行连接 经测试,当连接超时时,client.isConnected()仍然返回ture,无法判断是否连接超时 因此,通过发送pwd命令的方式,检查连接是否超时
|
|
|
- *
|
|
|
+ *
|
|
|
* @return this
|
|
|
*/
|
|
|
@Override
|
|
|
@@ -211,7 +239,7 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 改变目录
|
|
|
- *
|
|
|
+ *
|
|
|
* @param directory 目录
|
|
|
* @return 是否成功
|
|
|
*/
|
|
|
@@ -230,7 +258,7 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 远程当前目录
|
|
|
- *
|
|
|
+ *
|
|
|
* @return 远程当前目录
|
|
|
* @since 4.1.14
|
|
|
*/
|
|
|
@@ -256,7 +284,7 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 遍历某个目录下所有文件和目录,不会递归遍历
|
|
|
- *
|
|
|
+ *
|
|
|
* @param path 目录
|
|
|
* @return 文件或目录列表
|
|
|
*/
|
|
|
@@ -291,7 +319,7 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 判断ftp服务器文件是否存在
|
|
|
- *
|
|
|
+ *
|
|
|
* @param path 文件路径
|
|
|
* @return 是否存在
|
|
|
*/
|
|
|
@@ -356,15 +384,15 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 上传文件到指定目录,可选:
|
|
|
- *
|
|
|
+ *
|
|
|
* <pre>
|
|
|
* 1. path为null或""上传到当前路径
|
|
|
* 2. path为相对路径则相对于当前路径的子路径
|
|
|
* 3. path为绝对路径则上传到此路径
|
|
|
* </pre>
|
|
|
- *
|
|
|
+ *
|
|
|
* @param destPath 服务端路径,可以为{@code null} 或者相对路径或绝对路径
|
|
|
- * @param file 文件
|
|
|
+ * @param file 文件
|
|
|
* @return 是否上传成功
|
|
|
*/
|
|
|
@Override
|
|
|
@@ -375,15 +403,15 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 上传文件到指定目录,可选:
|
|
|
- *
|
|
|
+ *
|
|
|
* <pre>
|
|
|
* 1. path为null或""上传到当前路径
|
|
|
* 2. path为相对路径则相对于当前路径的子路径
|
|
|
* 3. path为绝对路径则上传到此路径
|
|
|
* </pre>
|
|
|
- *
|
|
|
- * @param file 文件
|
|
|
- * @param path 服务端路径,可以为{@code null} 或者相对路径或绝对路径
|
|
|
+ *
|
|
|
+ * @param file 文件
|
|
|
+ * @param path 服务端路径,可以为{@code null} 或者相对路径或绝对路径
|
|
|
* @param fileName 自定义在服务端保存的文件名
|
|
|
* @return 是否上传成功
|
|
|
*/
|
|
|
@@ -397,16 +425,15 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 上传文件到指定目录,可选:
|
|
|
- *
|
|
|
+ *
|
|
|
* <pre>
|
|
|
* 1. path为null或""上传到当前路径
|
|
|
* 2. path为相对路径则相对于当前路径的子路径
|
|
|
* 3. path为绝对路径则上传到此路径
|
|
|
* </pre>
|
|
|
- *
|
|
|
- *
|
|
|
- * @param path 服务端路径,可以为{@code null} 或者相对路径或绝对路径
|
|
|
- * @param fileName 文件名
|
|
|
+ *
|
|
|
+ * @param path 服务端路径,可以为{@code null} 或者相对路径或绝对路径
|
|
|
+ * @param fileName 文件名
|
|
|
* @param fileStream 文件流
|
|
|
* @return 是否上传成功
|
|
|
*/
|
|
|
@@ -443,8 +470,8 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 下载文件
|
|
|
- *
|
|
|
- * @param path 文件路径
|
|
|
+ *
|
|
|
+ * @param path 文件路径
|
|
|
* @param outFile 输出文件或目录
|
|
|
*/
|
|
|
@Override
|
|
|
@@ -456,10 +483,10 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 下载文件
|
|
|
- *
|
|
|
- * @param path 文件路径
|
|
|
+ *
|
|
|
+ * @param path 文件路径
|
|
|
* @param fileName 文件名
|
|
|
- * @param outFile 输出文件或目录
|
|
|
+ * @param outFile 输出文件或目录
|
|
|
*/
|
|
|
public void download(String path, String fileName, File outFile) {
|
|
|
if (outFile.isDirectory()) {
|
|
|
@@ -477,10 +504,10 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 下载文件到输出流
|
|
|
- *
|
|
|
- * @param path 文件路径
|
|
|
+ *
|
|
|
+ * @param path 文件路径
|
|
|
* @param fileName 文件名
|
|
|
- * @param out 输出位置
|
|
|
+ * @param out 输出位置
|
|
|
*/
|
|
|
public void download(String path, String fileName, OutputStream out) {
|
|
|
String pwd = null;
|
|
|
@@ -503,7 +530,7 @@ public class Ftp extends AbstractFtp {
|
|
|
|
|
|
/**
|
|
|
* 获取FTPClient客户端对象
|
|
|
- *
|
|
|
+ *
|
|
|
* @return {@link FTPClient}
|
|
|
*/
|
|
|
public FTPClient getClient() {
|