zoukankan      html  css  js  c++  java
  • java客户端调用ftp上传下载文件

    1:java客户端上传,下载文件。

    package com.li.utils;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    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;
    
    /**
     * ftp上传下载工具类
     * <p>Title: FtpUtil</p>
     * <p>Description: </p>
     * <p>Company: www.itcast.com</p> 
     * @author    入云龙
     * @date    2015年7月29日下午8:11:51
     * @version 1.0
     */
    public class FtpUtil {
    
        /** 
         * Description: 向FTP服务器上传文件 
         * @param host FTP服务器hostname 
         * @param port FTP服务器端口 
         * @param username FTP登录账号 
         * @param password FTP登录密码 
         * @param basePath FTP服务器基础目录
         * @param filePath FTP服务器文件存放路径。例如分日期存放:/2015/01/01。文件的路径为basePath+filePath
         * @param filename 上传到FTP服务器上的文件名 
         * @param input 输入流 
         * @return 成功返回true,否则返回false 
         */  
        public static boolean uploadFile(String host, int port, String username, String password, String basePath,
                String filePath, String filename, InputStream input) {
            boolean result = false;
            FTPClient ftp = new FTPClient();
            try {
                int reply;
                ftp.connect(host, port);// 连接FTP服务器
                // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
                ftp.login(username, password);// 登录
                reply = ftp.getReplyCode();
                if (!FTPReply.isPositiveCompletion(reply)) {
                    ftp.disconnect();
                    return result;
                }
                ftp.enterLocalPassiveMode();  //将ftp设置为被动模式。否则不成功。 主动模式,因为客户端防火墙将服务器20端口阻止了。
                //切换到上传目录
                if (!ftp.changeWorkingDirectory(basePath+filePath)) {
                    //如果目录不存在创建目录
                    String[] dirs = filePath.split("/");
                    String tempPath = basePath;
                    for (String dir : dirs) {
                        if (null == dir || "".equals(dir)) continue;
                        tempPath += "/" + dir;
                        if (!ftp.changeWorkingDirectory(tempPath)) {
                            if (!ftp.makeDirectory(tempPath)) {
                                return result;
                            } else {
                                ftp.changeWorkingDirectory(tempPath);
                            }
                        }
                    }
                }
                //设置上传文件的类型为二进制类型
                ftp.setFileType(FTP.BINARY_FILE_TYPE);
                //上传文件
                if (!ftp.storeFile(filename, input)) {
                    return result;
                }
                input.close();
                ftp.logout();
                result = true;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (ftp.isConnected()) {
                    try {
                        ftp.disconnect();
                    } catch (IOException ioe) {
                    }
                }
            }
            return result;
        }
        
        /** 
         * Description: 从FTP服务器下载文件 
         * @param host FTP服务器hostname 
         * @param port FTP服务器端口 
         * @param username FTP登录账号 
         * @param password FTP登录密码 
         * @param remotePath FTP服务器上的相对路径 
         * @param fileName 要下载的文件名 
         * @param localPath 下载后保存到本地的路径 
         * @return 
         */  
        public static boolean downloadFile(String host, int port, String username, String password, String remotePath,
                String fileName, String localPath) {
            boolean result = false;
            FTPClient ftp = new FTPClient();
            try {
                int reply;
                ftp.connect(host, port);
                // 如果采用默认端口,可以使用ftp.connect(host)的方式直接连接FTP服务器
                ftp.login(username, password);// 登录
                reply = ftp.getReplyCode();
                if (!FTPReply.isPositiveCompletion(reply)) {
                    ftp.disconnect();
                    return result;
                }
                ftp.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
                FTPFile[] fs = ftp.listFiles();
                for (FTPFile ff : fs) {
                    if (ff.getName().equals(fileName)) {
                        File localFile = new File(localPath + "/" + ff.getName());
    
                        OutputStream is = new FileOutputStream(localFile);
                        ftp.retrieveFile(ff.getName(), is);
                        is.close();
                    }
                }
    
                ftp.logout();
                result = true;
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (ftp.isConnected()) {
                    try {
                        ftp.disconnect();
                    } catch (IOException ioe) {
                    }
                }
            }
            return result;
        }
        
        public static void main(String[] args) {
            try {  
                FileInputStream in=new FileInputStream(new File("D:\data.txt"));
                boolean flag = uploadFile("192.168.100.91", 21, "liyafei", "1367356", "/home/liyafei/myfile","/file", "data.txt", in);
                System.out.println(flag);  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            }  
        }

    @Test
    public void testDownloadFile() {
    downloadFile("192.168.100.91", 21, "liyafei", "1367356",
    "/home/liyafei/myfile/file", "data.txt", "d:\");
    }
    }

    2: 给定一个目录,读取该目录下的文件和目录。返回给前端。

    package com.li.utils;
    
    import org.apache.commons.net.PrintCommandListener;
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.Iterator;
    import org.apache.log4j.Logger;
    /**
     * 列出FTP服务器上指定目录下面的所有文件
     * 层级目录逐个展开   参考这样的层级目录:http://download.qt.io/archive/qt/
     */
    public class FTPListAllFiles {
        private static Logger logger = Logger.getLogger(FTPListAllFiles.class);
        public FTPClient ftp;
        public ArrayList<String> arFiles;
    
        /**
         * 重载构造函数
         * @param isPrintCommmand 是否打印与FTPServer的交互命令
         */
        public FTPListAllFiles(boolean isPrintCommmand){
            ftp = new FTPClient();
            arFiles = new ArrayList<String>();
            if(isPrintCommmand){
                ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
            }
        }
    
        /**
         * 登陆FTP服务器
         * @param host FTPServer IP地址
         * @param port FTPServer 端口
         * @param username FTPServer 登陆用户名
         * @param password FTPServer 登陆密码
         * @return 是否登录成功
         * @throws IOException
         */
        public boolean login(String host,int port,String username,String password) throws IOException{
            this.ftp.connect(host,port);
            if(FTPReply.isPositiveCompletion(this.ftp.getReplyCode())){
                if(this.ftp.login(username, password)){
                    this.ftp.setControlEncoding("utf-8");
                    ftp.enterLocalPassiveMode();  //将ftp设置为被动模式。否则不成功。
                    return true;
                }
            }
            if(this.ftp.isConnected()){
                this.ftp.disconnect();
            }
            return false;
        }
    
        /**
         * 关闭数据链接
         * @throws IOException
         */
        public void disConnection() throws IOException{
            if(this.ftp.isConnected()){
                this.ftp.disconnect();
            }
        }
    
        /**
         * 递归遍历出目录下面所有文件
         * @param pathName 需要遍历的目录,必须以"/"开始和结束
         * @throws IOException
         */
        public void List(String pathName) throws IOException{
            if(pathName.startsWith("/") || pathName.endsWith("/")){
                String directory = pathName;
                //更换目录到当前目录
                this.ftp.changeWorkingDirectory(directory);
                FTPFile[] files = this.ftp.listFiles();
                for(FTPFile file:files){
                    if(file.isFile()){
    //                    String n=new String(file.getName().getBytes("gbk"),"utf-8");
    //                    System.out.println(n);
                        arFiles.add(directory+file.getName());
                    }else if(file.isDirectory()){
                        arFiles.add(file.getName()+"/");
    //                    List(directory+file.getName()+"/");
                    }
                }
            }else {
                //不以/结束或开头,是文件。点击下载
            }
        }
    
        /**
         * 递归遍历目录下面指定的文件名
         * @param pathName 需要遍历的目录,必须以"/"开始和结束
         * @param ext 文件的扩展名
         * @throws IOException
         */
        public void List(String pathName,String ext) throws IOException{
            if(pathName.startsWith("/")&&pathName.endsWith("/")){
                String directory = pathName;
                //更换目录到当前目录
                this.ftp.changeWorkingDirectory(directory);
                FTPFile[] files = this.ftp.listFiles();
                for(FTPFile file:files){
                    if(file.isFile()){
                        if(file.getName().endsWith(ext)){
                            arFiles.add(directory+file.getName());
                        }
                    }else if(file.isDirectory()){
                        List(directory+file.getName()+"/",ext);
                    }
                }
            }
        }
        public static void main(String[] args) throws IOException {
            FTPListAllFiles f = new FTPListAllFiles(false);
            if(f.login("192.168.100.91", 21, "liyafei", "1367356")){
    //            f.List("/","");
                f.List("/home/liyafei/myfile/");
            }
            f.disConnection();
            Iterator<String> it = f.arFiles.iterator();
            while(it.hasNext()){
                logger.info(it.next());
            }
    
        }
    }

    如果ftp使用用户名密码登录之后,根目录是为该用户的创建的目录,当切换路径时,需要去掉系统根目录到用户目录的路径,例如:

    FTPClient ftp = new FTPClient();
    ftp.login("uftp", password);// 登录   那么用户目录为/home/uftp
    boolean b = ftp.changeWorkingDirectory("/public");// 转移到FTP服务器目录,  应该将/home/uftp省去

       

    ftp主动模式和被动模式:https://www.cnblogs.com/ajianbeyourself/p/7655464.html

  • 相关阅读:
    VUE脚手架,babel转码 常用命令
    ES6那些事半功倍的新特性(一)
    vuex中怎么把‘库’中的状态对象赋值给内部对象(三种方法)
    VUE自定义指令生命周期,VUE生命周期
    判断是数组还是对象的方法
    利用cordova打包H5混合app
    webstorm皮肤外观样式快速设置,CMD的使用方法,webstorm11激活方法
    数组操作方法中的splice()和concat() 以及slice()
    Angularjs跨域
    Node.js的基础知识(一)
  • 原文地址:https://www.cnblogs.com/liyafei/p/8682208.html
Copyright © 2011-2022 走看看