首先两个服务器都要安装ftp服务(安装教程可以自行百度)。安装配置文件有时很重要如果不认真连不上后面的步骤都不行。
要理清ftp的两种模式一种是主动模式还有就是被动模式。
所谓主动模式:就是指客户端连接服务端的时候,告诉服务端,我们之间要进行通讯,数据交换。我申请开辟一个端口,专门用于我们之间的通信,也即C(client)端主动向S(Server)端发起的请求。被动模式就是指,一开始服务一起来,S端变开启一个端口告诉C端,我们之间的通讯就在这个端口下。也就C端被动的接受服务端。
主动模式:服务器向客户端敲门,然后客户端开门
被动模式:客户端向服务器敲门,然后服务器开门
因为我是用的是java程序上传的使用的是ftpclient工具类。所以我的工具类一开启是这样的:
* 上传文件(主动模式)--默认的模式
* @param ip
* @param port
* @param userName
* @param password
* @param sourceStream
* @param ftpDir
* @param ftpFileName
* @param charset
* @throws FrontEndException
*/
public final static void upload(String ip, int port, String userName, String password, InputStream sourceStream, String ftpDir, String ftpFileName, String charset) throws FrontEndException {
FTPClient ftpClient = new FTPClient();
try {
if (port <= 0)
ftpClient.connect(ip);
else ftpClient.connect(ip, port);
ftpClient.login(userName, password);
//设置上传目录
ftpClient.changeWorkingDirectory(ftpDir);
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding(charset);
//设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
ftpClient.storeFile(ftpFileName, sourceStream);
} catch (IOException e) {
throw new FrontEndException("上传文件失败", e);
} finally {
try {
ftpClient.disconnect();
} catch (IOException e) {
LOGGER.error("断开ftp连接异常", e);
}
}
}
心想,或许,真的是和这个模式有关。此时我再仔细Debug了一下。当执行到
ftpClient.storeFile(ftpFileName, sourceStream);我看到返回的是false,那这个时候基本上可以断定是文件没有上传成功。如果服务器端使用的是被动模式,而我们使用主动模式去上传文件的话。服务器肯定不会接收的
这个时候,感觉问题应该差不多找到了。网上一搜,加上一句设置被动模式的代码
这个时候,感觉问题应该差不多找到了。网上一搜,加上一句设置被动模式的代码
//设置被动模式 ftpClient.enterLocalPassiveMode();
再仔细测试了一下,果然问题就出在这里。解决了。此时正确的代码为
[html] view plain copy
/**
* 被动模式---上传文件
* @param ip
* @param port
* @param userName
* @param password
* @param sourceStream
* @param ftpDir
* @param ftpFileName
* @param charset
* @throws FrontEndException
*/
public final static void uploadPassiveMode(String ip, int port, String userName, String password, InputStream sourceStream, String ftpDir, String ftpFileName, String charset) throws FrontEndException {
FTPClient ftpClient = new FTPClient();
try {
if (port <= 0)
ftpClient.connect(ip);
else ftpClient.connect(ip, port);
//登录
boolean login = ftpClient.login(userName, password);
StringBuilder service = new StringBuilder();
service.append("上传FTP【ip="+ip+",port="+port+"】,");
if(login){
LOGGER.info(service.append("登录成功...").toString());
//设置上传目录
ftpClient.changeWorkingDirectory(ftpDir);
ftpClient.setBufferSize(1024);
ftpClient.setControlEncoding(charset);
//设置被动模式
<span style="color:#ff0000;">ftpClient.enterLocalPassiveMode();</span>
//设置文件类型(二进制)
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
if(ftpClient.storeFile(ftpFileName, sourceStream)){
LOGGER.info(service.append("上传成功...").toString());
} else {
LOGGER.info(service.append("上传失败...").toString());
}
} else {
LOGGER.info(service.append("登录失败...").toString());
}
} catch (IOException e) {
throw new FrontEndException("上传文件失败", e);
} finally {
try {
ftpClient.disconnect();
} catch (IOException e) {
LOGGER.error("断开ftp连接异常", e);
}
}
}
同理,我们在下载对应的结果文件的时候。也需要设置相应的被动模式