首先两个服务器都要安装ftp服务(安装教程可以自行百度)。安装配置文件有时很重要如果不认真连不上后面的步骤都不行。
要理清ftp的两种模式一种是主动模式还有就是被动模式。
所谓主动模式:就是指客户端连接服务端的时候,告诉服务端,我们之间要进行通讯,数据交换。我申请开辟一个端口,专门用于我们之间的通信,也即C(client)端主动向S(Server)端发起的请求。被动模式就是指,一开始服务一起来,S端变开启一个端口告诉C端,我们之间的通讯就在这个端口下。也就C端被动的接受服务端。
主动模式:服务器向客户端敲门,然后客户端开门
被动模式:客户端向服务器敲门,然后服务器开门
* 上传文件(主动模式)--默认的模式 * @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,那这个时候基本上可以断定是文件没有上传成功。如果服务器端使用的是被动模式,而我们使用主动模式去上传文件的话。服务器肯定不会接收的
这个时候,感觉问题应该差不多找到了。网上一搜,加上一句设置被动模式的代码
这个时候,感觉问题应该差不多找到了。网上一搜,加上一句设置被动模式的代码
再仔细测试了一下,果然问题就出在这里。解决了。此时正确的代码为
[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); } } }同理,我们在下载对应的结果文件的时候。也需要设置相应的被动模式