使用APACHE下的Commons Net连接FTP

内容出处https://study.163.com/course/courseMain.htm?courseId=1209288803

APACHE官网连接

https://apache.org/

Commons Net下载地址

http://commons.apache.org/

找到Net点进去

JAVA-使用Commons Net连接FTP_Commons Net

 

JAVA-使用Commons Net连接FTP_Commons Net_02

 http://commons.apache.org/proper/commons-net/

下载地址

http://commons.apache.org/proper/commons-net/download_net.cgi

JAVA-使用Commons Net连接FTP_JAVA_03

 

 官方例子

JAVA-使用Commons Net连接FTP_Commons Net_04

 API帮助

JAVA-使用Commons Net连接FTP_JAVA_05

 JAVA-使用Commons Net连接FTP_JAVA_06

 放到项目里的jar包

JAVA-使用Commons Net连接FTP_Commons Net_07

 项目小例子,源代码

JAVA-使用Commons Net连接FTP_JAVA_08

package my;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.text.SimpleDateFormat;import org.apache.commons.net.ftp.FTP;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPFile;import org.apache.commons.net.ftp.FTPReply;import org.omg.CORBA.portable.InputStream;public class test
{    public static void main(String[] args) throws Exception
    {        // TODO Auto-generated method stub
        FTPClient ftp = new FTPClient();        
        //连接服务器
        ftp.connect("192.168.1.101", 100);        
        boolean reply = ftp.isConnected();        if(!reply)
        {
            System.out.println("** 无法连接至FTP服务器");
            System.exit(1);
        }        
//        int reply = ftp.getReplyCode();//        if(!FTPReply.isPositiveCompletion(reply));//        {//            ftp.disconnect();//            System.out.println("** 无法连接至FTP服务器");//            System.exit(1);//        }
        
        if(!ftp.login("administrator", "Lu123456"))
        {
            ftp.logout();
            System.out.println("** 错误的用户或密码");
            System.exit(1);
        }
        
        System.out.println("Connected.");        
        //字节传输BINARY_FILE_TYPE        //文本传输ASCII_FILE_TYPE        //一般使用BINARY模式来传输文件,很少使用ASCII_FILE_TYPE        ftp.setFileType(FTP.BINARY_FILE_TYPE);        
        //主动模式:enterLocalActiveMode()        //被动模式:enterLocalPassiveMode()        //一般选择被动模式        ftp.enterLocalPassiveMode();        
        //设置控制通道的字符集,要与服务端的设定一直
        ftp.setControlEncoding("GBK");//用GBK或者UTF-8        
        //切换目录,设置当前目录(用ftpPath()转换一下)
        boolean rc = ftp.changeWorkingDirectory(ftpPath("/视频"));        if(!rc)
        {
            System.out.println("切换目录出错!");            
        }    
        //列出所有的文件/子目录
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("> list");
        FTPFile[] ftpFiles = ftp.listFiles();//查看目录
        for(FTPFile f : ftpFiles)
        {
            String time = sdf.format(f.getTimestamp().getTime());
            String info = "";            if(f.isDirectory())
                info = String.format("+ %-20s", f.getName());            else
                info = String.format("  %-20s %8d   %s", f.getName(), f.getSize(), time);
            System.out.println(info);        
        }        
        
        //创建目录
        ftp.makeDirectory(ftpPath("/音乐"));        
        //删除目录
        ftp.removeDirectory(ftpPath("/图片"));        
        //重命名
        ftp.rename(ftpPath("/文档.docx"), ftpPath("/改了名字的文档.docx"));    
        //上传文件
        File uploadFile = new File("D:/1/2/ABC.docx");
        FileInputStream uploadInStream = new FileInputStream(uploadFile);
        
        String remotePath = ftpPath(uploadFile.getName());        
        //小文件直接用        //ftp.storeFile(remotePath, uploadInStream);        
        //大文件,可以自己掌握进度
        OutputStream uploadOutStream = ftp.storeFileStream(remotePath);        byte[] uploadBuffer = new byte[4000];        while(true)
        {            int n = uploadInStream.read(uploadBuffer);            if(n <= 0) break;
            
            uploadOutStream.write(uploadBuffer, 0, n);
        }
        uploadInStream.close();
        uploadOutStream.close();        
//        //下载文件//        String remptePath = ftpPathGbk("/演示文稿.pptx");//服务器文件路径//        File localFile = new File("D:/1/2/演示文稿.pptx");//下载到本地的路径//        localFile.getParentFile().mkdirs();//        OutputStream outStream = new FileOutputStream(localFile);//        //        //小文件直接用//        //ftp.retrieveFile(remptePath, outStream);//        //        //大文件,可以自己掌握进度//        java.io.InputStream inStream = ftp.retrieveFileStream(remptePath);//        if(inStream == null)//            throw new Exception("远程文件不存在!" + remptePath);//        //        byte[] buffer = new byte[4000];//        while(true)//        {//            int n = inStream.read(buffer);//            if(n <= 0) break;//            //            outStream.write(buffer, 0, n);//        }//        inStream.close();//        outStream.close();        

        
        ftp.logout();
        ftp.disconnect();
        System.out.println("Ouit.");
    }    //API里对中文FTP目录的处理有点问题    //在调用changeWorkingDirectory() / listFiles()等方法时,将参数路径转换一下
    private static String ftpPath(String path)
    {        try
        {            return new String(path.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);
        }catch(UnsupportedEncodingException e)
        {            return "";
        }
    }
    
}

演示

JAVA-使用Commons Net连接FTP_JAVA_09

 

程序员阿飞

2021年5月22日