java实现FTP上传文件

最近由于项目需要添加了上传文件到FTP服务器的功能,java上传文件到FTP服务器有多种实现,广泛被使用的有如下两种:一种是使用sun公司提供的sun.net.ftp包里面的FtpClient,另一种是Apache组织提供的org.apache.commons.net.ftp包里的FTPClient,今天就简单的介绍下第二种的java实现。

首先需要导入commons.net-3.2.jar,或者其他版本的该jar包亦可,然后创建一个FTP借口类:

public class Ftp {
    private String ipAddr;//ip
    private Integer port;//端口号
    private String userName;//用户名
    private String pwd;//密码
    private String path;//上传路径
    public Ftp(String ipAddr, Integer port, String userName, String pwd,
            String path) {
        this.ipAddr = ipAddr;
        this.port = port;
        this.userName = userName;
        this.pwd = pwd;
        this.path = path;
    }
    public String getIpAddr() {
        return ipAddr;
    }
    public void setIpAddr(String ipAddr) {
        this.ipAddr = ipAddr;
    }
    public Integer getPort() {
        return port;
    }
    public void setPort(Integer port) {
        this.port = port;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPwd() {
        return pwd;
    }
    public void setPwd(String pwd) {
        this.pwd = pwd;
    }
    public String getPath() {
        return path;
    }
    public void setPath(String path) {
        this.path = path;
    }
}
,然后编写了一个工具类,来实现连接FTP服务器和上传文件的功能,如下所示:

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

public class FtpUtil {
    
    private static FTPClient ftp;
    
    /**
     * 获取ftp连接
     */
    public static boolean connectFtp(Ftp f) throws Exception{
        ftp=new FTPClient();
        boolean flag=false;
        ftp.connect(f.getIpAddr(),f.getPort());
        ftp.login(f.getUserName(), f.getPwd());
        ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
        //设置缓冲区
        ftp.setBufferSize(1024*1024);
        int reply= ftp.getReplyCode();
        System.out.println("getReplyCode:"+reply);
        if (!FTPReply.isPositiveCompletion(reply)) {      
              ftp.disconnect();      
              return flag;      
        }
        createDir(f.getPath());
        System.out.println("设置工作文件夹:"+ftp.changeWorkingDirectory("/"+f.getPath()));
        flag = true;      
        return flag;
    }
    /**
     * 创建文件夹
     * @param dirname
     */
    public static void createDir(String dirname){
        try{
            ftp.makeDirectory(dirname);
            System.out.println("在目标服务器上成功建立了文件夹: " + dirname);
        }catch(Exception ex){
            System.out.println(ex.getMessage());
        }
    }
    
    /**
     * 关闭ftp连接
     */
    public static void closeFtp(){
        if (ftp!=null && ftp.isConnected()) {
            try {
                ftp.logout();
                ftp.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * ftp上传文件
     * @param f表示上传文件,fileName表示生成文件名
     */
    public static void upload(File f,String fileName) throws Exception{
            File sourcefile=new File(f.getPath());
            FileInputStream input=new FileInputStream(sourcefile);
            ftp.storeFile(fileName,input);
            input.close();
    }
    
//    public static void main(String[] args) throws Exception{  
//            Ftp f=new Ftp("192.168.0.106", 21, "sealAdmin", "123", "images");
//            FtpUtil.connectFtp(f);
//            File file = new File("D:/images/shamo2.jpg");
//            FtpUtil.upload(file,"new.jpg");//把文件上传在ftp上
//            FtpUtil.closeFtp();
//       }  
}
其中connectFtp方法负责实现连接服务器功能,ftp.connect(f.getIpAddr(),f.getPort())连接ip和端口,ftp.login(f.getUserName(), f.getPwd());登录,一般情况下这些数据正确填写的情况下,可以正常连接到ftp,ftp.getReplyCode()获得连接返回值,具体的返回值可以上网查询或查看源文件比对,200-300的返回值都是连接成功的标志,createDir(f.getPath())主要实现创建ftp上传的路径,如果该路径第一次上传时不存在则去调用 ftp.makeDirectory(dirname)创建该文件路径,如果已存在则不再创建;ftp.changeWorkingDirectory("/"+f.getPath())是设置上传存储的路径,比如我测试输入的是images,则上传到ftp服务器
时会自动创建一级文件夹images,然后上传的文件都被传到images文件夹下,可以根据需要来写文件夹如images/myupload/picture,这样就会创建三级文件夹;ftp.setBufferSize(1024*1024)是设置缓冲区,这个会影响上传速度,如果不设置的话,一般默认1kb/s或者其他较低的上传速度,我这里根据网路带宽设置了比较合适的速度来提高上传效率。

其中另一个比较重要的方法就是upload(File f,String fileName),该方法接受一个File变量,f表示上传文件,fileName表示生成的文件名(包括后缀名),这样你就可以随意新建上传后的文件名。

这里只介绍了上传方法,如需要其他方法,比如上传文件夹或者下载文件或下载整个文件夹可以自行添加实现。

猜你喜欢

转载自blog.csdn.net/u012880682/article/details/53783630