美文网首页java
[转载]Java实现FTP服务器的上传、下载、删除、查看文件列表

[转载]Java实现FTP服务器的上传、下载、删除、查看文件列表

作者: zxk175 | 来源:发表于2016-09-25 10:20 被阅读1044次
    package com.zhangjun.ftp;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.commons.io.IOUtils;
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;
    
    /**
     * ftp连接管理(使用apache commons-net-1.4.1 lib)
     * 
     * @author 张军
     * @version 1.0 20120912
     */
    public class FTPClientUtil {
        private FTPClient ftpClient = null;
        private String server;
        private int port;
        private String userName;
        private String userPassword;
    
        public static void main(String[] args) {
            FtpClientUtil f = new FtpClientUtil("10.3.12.17", 21, "was", "was");
            try {
                if (f.open()) {
                    // 远程路径为相对路径
                    f.get("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/qunarlog.txt", "E:/zhangjun.txt");
                    f.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public FtpClientUtil(String server, int port, String userName, String userPassword) {
            this.server = server;
            this.port = port;
            this.userName = userName;
            this.userPassword = userPassword;
        }
    
        /**
         * 链接到服务器
         * 
         * @return
         * @throws Exception
         */
        public boolean open() {
            if (ftpClient != null && ftpClient.isConnected()) {
                return true;
            }
            try {
                ftpClient = new FTPClient();
                // 连接
                ftpClient.connect(this.server, this.port);
                ftpClient.login(this.userName, this.userPassword);
                // 检测连接是否成功
                int reply = ftpClient.getReplyCode();
                if (!FTPReply.isPositiveCompletion(reply)) {
                    this.close();
                    System.exit(1);
                }
                // 设置上传模式binally or ascii
                ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);
    
                return true;
            } catch (Exception ex) {
                // 关闭
                this.close();
                return false;
            }
    
        }
    
        private boolean cd(String dir) throws IOException {
            if (ftpClient.changeWorkingDirectory(dir)) {
                return true;
            } else {
                return false;
            }
        }
    
        /**
         * 获取目录下所有的文件名称
         * 
         * @param filePath
         * @return
         * @throws IOException
         */
    
        private FTPFile[] getFileList(String filePath) throws IOException {
            FTPFile[] list = ftpClient.listFiles();
            return list;
        }
    
        /**
         * 循环将设置工作目录
         */
        public boolean changeDir(String ftpPath) {
            if (!ftpClient.isConnected()) {
                return false;
            }
            try {
    
                // 将路径中的斜杠统一
                char[] chars = ftpPath.toCharArray();
                StringBuffer sbStr = new StringBuffer(256);
                for (int i = 0; i < chars.length; i++) {
    
                    if ('\\' == chars[i]) {
                        sbStr.append('/');
                    } else {
                        sbStr.append(chars[i]);
                    }
                }
                ftpPath = sbStr.toString();
    
                if (ftpPath.indexOf('/') == -1) {
                    // 只有一层目录
                    ftpClient.changeWorkingDirectory(new String(ftpPath.getBytes(), "iso-8859-1"));
                } else {
                    // 多层目录循环创建
                    String[] paths = ftpPath.split("/");
                    for (int i = 0; i < paths.length; i++) {
                        ftpClient.changeWorkingDirectory(new String(paths[i].getBytes(), "iso-8859-1"));
                    }
                }
    
                return true;
            } catch (Exception e) {
                return false;
            }
        }
    
        /**
         * 循环创建目录,并且创建完目录后,设置工作目录为当前创建的目录下
         */
        public boolean mkDir(String ftpPath) {
            if (!ftpClient.isConnected()) {
                return false;
            }
            try {
                // 将路径中的斜杠统一
                char[] chars = ftpPath.toCharArray();
                StringBuffer sbStr = new StringBuffer(256);
                for (int i = 0; i < chars.length; i++) {
    
                    if ('\\' == chars[i]) {
                        sbStr.append('/');
                    } else {
                        sbStr.append(chars[i]);
                    }
                }
                ftpPath = sbStr.toString();
    
                if (ftpPath.indexOf('/') == -1) {
                    // 只有一层目录
                    ftpClient.makeDirectory(new String(ftpPath.getBytes(), "iso-8859-1"));
                    ftpClient.changeWorkingDirectory(new String(ftpPath.getBytes(), "iso-8859-1"));
                } else {
                    // 多层目录循环创建
                    String[] paths = ftpPath.split("/");
                    for (int i = 0; i < paths.length; i++) {
                        ftpClient.makeDirectory(new String(paths[i].getBytes(), "iso-8859-1"));
                        ftpClient.changeWorkingDirectory(new String(paths[i].getBytes(), "iso-8859-1"));
                    }
                }
    
                return true;
            } catch (Exception e) {
                return false;
            }
        }
    
        /**
         * 上传文件到FTP服务器
         * 
         * @param localPathAndFileName
         *            本地文件目录和文件名
         * @param ftpFileName
         *            上传后的文件名
         * @param ftpDirectory
         *            FTP目录如:/path1/pathb2/,如果目录不存在回自动创建目录
         * @throws Exception
         */
        public boolean put(String localDirectoryAndFileName, String ftpFileName, String ftpDirectory) {
            if (!ftpClient.isConnected()) {
                return false;
            }
            boolean flag = false;
            if (ftpClient != null) {
                File srcFile = new File(localDirectoryAndFileName);
                FileInputStream fis = null;
                try {
                    fis = new FileInputStream(srcFile);
    
                    // 创建目录
                    this.mkDir(ftpDirectory);
    
                    ftpClient.setBufferSize(1024);
                    ftpClient.setControlEncoding("UTF-8");
    
                    // 设置文件类型(二进制)
                    ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
    
                    // 上传
                    flag = ftpClient.storeFile(new String(ftpFileName.getBytes(), "iso-8859-1"), fis);
                } catch (Exception e) {
                    this.close();
                    return false;
                } finally {
                    IOUtils.closeQuietly(fis);s
                }
            }
            return flag;
        }
    
        /**
         * 从FTP服务器上下载文件并返回下载文件长度
         * 
         * @param ftpDirectoryAndFileName
         * @param localDirectoryAndFileName
         * @return
         * @throws Exception
         */
        public long get(String ftpDirectoryAndFileName, String localDirectoryAndFileName) {
            long result = 0;
            if (!ftpClient.isConnected()) {
                return 0;
            }
            ftpClient.enterLocalPassiveMode();
            try {
                // 将路径中的斜杠统一
                char[] chars = ftpDirectoryAndFileName.toCharArray();
                StringBuffer sbStr = new StringBuffer(256);
                for (int i = 0; i < chars.length; i++) {
    
                    if ('\\' == chars[i]) {
                        sbStr.append('/');
                    } else {
                        sbStr.append(chars[i]);
                    }
                }
                ftpDirectoryAndFileName = sbStr.toString();
                String filePath = ftpDirectoryAndFileName.substring(0, ftpDirectoryAndFileName.lastIndexOf("/"));
                String fileName = ftpDirectoryAndFileName.substring(ftpDirectoryAndFileName.lastIndexOf("/") + 1);
                this.changeDir(filePath);
                ftpClient.retrieveFile(new String(fileName.getBytes(), "iso-8859-1"),
                        new FileOutputStream(localDirectoryAndFileName)); // download
                System.out.print(ftpClient.getReplyString()); // check result
    
            } catch (IOException e) {
                e.printStackTrace();
            }
            return result;
        }
    
        /**
         * 返回FTP目录下的文件列表
         * 
         * @param ftpDirectory
         * @return
         */
        public List getFileNameList(String ftpDirectory) {
            List list = new ArrayList();
            if (!open())
                return list;
            try {
                DataInputStream dis = new DataInputStream(ftpClient.nameList(ftpDirectory));
                String filename = "";
                while ((filename = dis.readLine()) != null) {
                    list.add(filename);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return list;
            return list;
        }
    
        /**
         * 删除FTP上的文件
         * 
         * @param ftpDirAndFileName
         */
        public boolean deleteFile(String ftpDirAndFileName) {
            if (!ftpClient.isConnected()) {
                return false;
            }
            return true;
        }
    
        /**
         * 删除FTP目录
         * 
         * @param ftpDirectory
         */
        public boolean deleteDirectory(String ftpDirectory) {
            if (!ftpClient.isConnected()) {
                return false;
            }
            return true;
        }
    
        /**
         * 关闭链接
         */
        public void close() {
            try {
                if (ftpClient != null && ftpClient.isConnected())
                    ftpClient.disconnect();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public FTPClient getFtpClient() {
            return ftpClient;
        }
    
        public void setFtpClient(FTPClient ftpClient) {
    
            this.ftpClient = ftpClient;
        }
    }
    
    

    引用地址

    相关文章

      网友评论

        本文标题:[转载]Java实现FTP服务器的上传、下载、删除、查看文件列表

        本文链接:https://www.haomeiwen.com/subject/bjkfyttx.html