zoukankan      html  css  js  c++  java
  • JAVA-使用Commons Net连接FTP

    使用APACHE下的Commons Net连接FTP

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

    APACHE官网连接

    https://apache.org/

    Commons Net下载地址

    http://commons.apache.org/

    找到Net点进去

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

    下载地址

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

     官方例子

     API帮助

     

     放到项目里的jar包

     项目小例子,源代码

    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 "";
            }
        }
        
    }

    演示

    程序员阿飞

    2021年5月22日

    作者: 阿飞

    出处: https://www.cnblogs.com/nxopen2018/>

    关于作者:专注NX开发、VC++开发、数据库、三维建模领域,请多多赐教!

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可留言(博客文章底部留言)咨询.

  • 相关阅读:
    使用padding值控制控件的隐藏与显示
    首篇 sdk 之 AlertDialog
    eclipse中svn项目重定向地址
    Activity回传值报错:Failure delivering result ResultInfo{who=null,request=7,result = 0,data=null}
    常见字符集&乱码问题
    rhel 6.x 使用 udev scsi rules 配置裸设备
    rsync 同步文件
    debian 8.2 + apt-get + mongodb 3.2 + replica set
    debian 8.2 + apt-get + mongodb 3.2
    oracle virtualbox 扩大虚拟机硬盘
  • 原文地址:https://www.cnblogs.com/nxopen2018/p/14800208.html
Copyright © 2011-2022 走看看