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

首先两个服务器都要安装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);  
            }  
        }  
    } 
同理,我们在下载对应的结果文件的时候。也需要设置相应的被动模式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值