从一个服务器向另一个服务器上传文件所遇到的问题(两个服务器都是云服务器)

匿名 (未验证) 提交于 2019-12-03 00:19:01

首先两个服务器都要安装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);               }           }       } 
同理,我们在下载对应的结果文件的时候。也需要设置相应的被动模式
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!