ftp文件上传

我使用Ser-U在本地创建了一个ftp
java

若是没有防火墙,而且实现最简单的功能,这样写就好了。apache

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Test {
    public static void  main(String[] args){
        FTPClient ftpClient = new FTPClient();
        try{
            File file = new File("D:\\downLoad\\笛子基本教程.pdf");
            ftpClient.setDefaultPort(21);//端口号
            ftpClient.connect("127.0.0.1");//服务器地址
            ftpClient.login("rainmanqqst","888888");//用户名和密码
            int reply = ftpClient.getReplyCode();//获取链接状况,230为登录成功
            if(!FTPReply.isPositiveCompletion(reply)){//检查是否登录成功,值开头为2
                ftpClient.disconnect();
                System.err.println("FTP refused connection");
            }else{
                
            }
            ftpClient.storeFile("A.pdf",new FileInputStream(file));//传输文件,将文件名设为A.pdf
            ftpClient.disconnect();
        }catch (IOException a){
            a.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

然而正式使用的时候,防火墙是一个绕不过去的坎,因此ftp的模式就必须加入进来了。安全

ftp使用的是TCP协议,一般使用两个端口,命令端口(用于接受命令请求)和数据端口(发出数据)。服务器

ftp能够分主动模式(PORT)和被动模式(PASV)。在主动模式中,客户端会使用本身的一个N端口访问服务器的21命令端口,同时开启一个N+1的端口用于监听。而服务端在收到客户端的请求时,会将本身的数据端口20,试图链接到客户端的N+1端口。在被动模式中客户端会首先向服务端声明被动模式,而后开启两个端口N和N+1,其中N端口会链接服务器的21端口,而后服务器告诉客户端一个任意的端口P,客户端会试图使用N+1端口链接上P。post

在使用主动模式时,服务端会主动链接客户端,可是在这个过程当中链接可能被客户端的防火墙阻止。由于客户端只提供了N+1端口,可能正被防火墙保护着,因此链接不上,N为大于1024的任意值,因此使用特定的规则也有难度。其结果就是客户端不得不放开本身的防火墙策略,天然而然的会有些安全隐患。.net

在使用被动模式时,因为客户端会主动链接服务端的P端口,因此在这个时候,P(P:为默认值)端口可能被防火墙保护着,因此为了实现ftp链接,它必须开放本身的防火墙。在这个时候服务端变得不安全了。不过在使用被动模式时,因为服务端提供的数据端口P是任意的,不想主动模式中的20是默认的,因此下降了被人窃取数据的风险。从这点看,它又是安全的。code

考虑到这点,代码就必须作出些调整。blog

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class Test {
    public static void  main(String[] args){
        FTPClient ftpClient = new FTPClient();
        try{
            File file = new File("D:\\downLoad\\笛子基本教程.pdf");
            ftpClient.setDefaultPort(21);
            ftpClient.connect("127.0.0.1");
            ftpClient.login("rainmanqqst","888888");
            int reply = ftpClient.getReplyCode();
            if(!FTPReply.isPositiveCompletion(reply)){
                ftpClient.disconnect();
                System.err.println("FTP refused connection");
            }else{
                
            }
            ftpClient.enterLocalPassiveMode();//
            ftpClient.storeFile("A.pdf",new FileInputStream(file));
            ftpClient.disconnect();
        }catch (IOException a){
            a.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

使用主动模式时,若是服务器20号端口没有开放,在程序运行的过程当中,会一直试图链接,致使运行如下代码时,停滞不前
教程

            if(!FTPReply.isPositiveCompletion(reply)){
                ftpClient.disconnect();
                System.err.println("FTP refused connection");
            }else{
                
            }

解决方法是去服务端手动开放20端口,或者采用被动模式。get

或者是虽然采用被动模式,可是服务端的防火墙阻止了链接。这时候,就不是代码的问题了,要去服务器的防火墙,修改一下配置。

参考资料:

http://chenyoulu.diandian.com/post/2012-11-20/40042052590

http://jackiechen.blog.51cto.com/196075/193883

http://my.oschina.net/caiyuan/blog/6707

相关文章
相关标签/搜索