问题背景:在本地使用java代码进行文件上传到远程的ftp服务器上,出现了425错误
使用的是commons-net-3.5.jar中的ftpclient进行文件上传,以下是上传的代码:
/**
* 向FTP服务器上传文件
* @param host FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param basePath FTP服务器基础目录
* @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
* @param filename 上传到FTP服务器上的文件名
* @param input 输入流
* @return 成功返回true,否则返回false
* */
public static boolean upload(String host, int port, String username, String password,
String basePath, String filePath, String filename, InputStream input) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
// 登录
if(!loginToFtp(ftp, host, port, username, password))
return result;
//切换到上传目录
if (!ftp.changeWorkingDirectory(basePath + filePath)) {
//如果目录不存在创建目录
String[] dirs = filePath.split("/");
String tempPath = basePath;
for (String dir : dirs) {
if (null == dir || "".equals(dir)) continue;
tempPath += "/" + dir;
if (!ftp.changeWorkingDirectory(tempPath)) {
if (!ftp.makeDirectory(tempPath)) {
return result;
} else {
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//上传文件
if (!ftp.storeFile(filename, input)) {
return result;
}
input.close();
ftp.logout();
result = true;
} catch (IOException e) {
e.printStackTrace();
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (IOException ioe) {
}
}
}
return result;
}
// 登录ftp服务器
private static boolean loginToFtp(FTPClient ftp, String host, int port, String username, String password) throws SocketException, IOException {
int reply;
ftp.connect(host, port);
// 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
ftp.login(username, password);// 登录
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
return false;
}
return true;
}
备注:
1.使用windows自身的ftp客户端可以进行上传至远程服务器
2.将ftp服务器放在本地同样可以上传
Updated on January 25, 2017
I encountered the upload error 425 again later, and found that the main problem was the active mode and passive mode of ftp. If the client opens the port (or closes the firewall) and uploads in active mode, there will be no problem. If the client turns on the firewall or the firewall does not open the corresponding port, the active mode is used to upload files. Although you can log in, the passive mode can be used to solve the problem. The client must also be set to passive mode.
==================
After accidentally replacing tomcat, I found the reason. Previously, I used tomcat7 that comes with myeclipse, which may conflict with ftp. After changing to tomcat8.X, I can upload normally.