问题背景:在本地使用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服务器放在本地同样可以上传
迷茫2017-04-18 10:28:51
2017년 1월 25일 업데이트
나중에 다시 425의 업로드 오류가 발생했고 주요 문제는 ftp의 활성 모드와 수동 모드에 있다는 것을 알게 되었습니다. 클라이언트가 포트를 열고(또는 방화벽을 닫고) 활성 모드로 업로드하면 문제가 없습니다. 클라이언트가 방화벽을 켜거나 방화벽이 해당 포트를 열지 않는 경우에는 활성 모드를 사용하여 파일을 업로드할 수 있지만 문제를 해결하려면 수동 모드를 사용해야 합니다. 패시브 모드.
==================
실수로 톰캣을 교체하다가 원인을 찾았습니다. 이전에는 myeclipse와 함께 제공되는 tomcat7을 사용했는데, 이는 ftp와 충돌할 수 있습니다. tomcat8.X로 변경한 후에는 정상적으로 업로드가 가능합니다.