• Java操作FTP工具类(实例详解)


    这里使用Apache的FTP jar 包

    没有使用Java自带的FTPjar包

     工具类

    package com.zit.ftp;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.SocketException;
    import java.util.Properties;
    
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;
    import org.apache.log4j.Logger;
    
    import com.zit.adapter.camera.CameraListener;
    
    
    public class FTPUtil {
    
        private static Logger logger = Logger.getLogger(FTPUtil.class);
        
        private static String classPath=CameraListener.class.getResource("/").getPath();
        private static String filesPath = classPath.substring(0, classPath.indexOf("WEB-INF")) + "file" ;
        
        private FTPClient ftpClient;
        //从本地文件获取各种属性
        private static String ftpIP=FTPConfig.getFTPHost();
        private static Integer ftpPort=Integer.valueOf(FTPConfig.getFTPPort());
        private static String ftpUserName=FTPConfig.getUserName();
        private static String ftpPassword=FTPConfig.getPassword();
        private static String ftpEncode = FTPConfig.getFTPEncode();
        private static String localPath=FTPConfig.getLocalFilePath();
        
        public FTPUtil() {
            
        }
        
        public synchronized boolean connectServer() {
            ftpClient = new FTPClient();
            ftpClient.setControlEncoding(ftpEncode);//解决上传文件时文件名乱码
            int reply = 0 ;
            try {
                // 连接至服务器
                ftpClient.connect(ftpIP,ftpPort);
                // 登录服务器
                ftpClient.login(ftpUserName, ftpPassword);
                //登陆成功,返回码是230
                reply = ftpClient.getReplyCode();
                // 判断返回码是否合法
                if(!FTPReply.isPositiveCompletion(reply)) {
                    ftpClient.disconnect();
                    return false;
                }
            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            return true;
        }
        
        //判断ftp服务器文件是否存在    
        public boolean existFile(String path)  {
            boolean flag = false;
            FTPFile[] ftpFileArr;
            try {
                ftpFileArr = ftpClient.listFiles(path);
                if (ftpFileArr.length > 0) {
                    flag = true;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return flag;
        }
        
        //删除ftp文件
        public synchronized boolean deleteFile(String pathname, String filename){ 
            boolean flag = false; 
            try { 
                System.out.println("开始删除文件");
                //切换FTP目录 
                ftpClient.changeWorkingDirectory(pathname); 
                ftpClient.dele(filename); 
                ftpClient.logout();
                flag = true; 
                System.out.println("删除文件成功");
            } catch (Exception e) { 
                System.out.println("删除文件失败");
                e.printStackTrace(); 
            } finally {
                if(ftpClient.isConnected()){ 
                    try{
                        ftpClient.disconnect();
                    }catch(IOException e){
                        e.printStackTrace();
                    }
                } 
            }
            return flag; 
        }
        
        //从FTP server下载到本地文件夹
        public synchronized boolean download(String path){
            boolean flag = false;
            FTPFile[] fs=null;
            try {
                fs = ftpClient.listFiles("aaa");
                if(fs.length<0) {
                    return flag;
                }
                //1、遍历FTP路径下所有文件
                for(FTPFile file:fs){
                    
    //                File localFile = new File(localPath+"/"+file.getName());
                    //2、保存到本地
                    OutputStream os = new FileOutputStream(localFile);
                    //retrieveFile(FTP服务端的源路径),这个路径要和listFiles的路径一致
                    ftpClient.retrieveFile("aaa/" + file.getName(), os);
                    //3、删除FTP中的上面保存的文件
                    //循环外关闭,读一个关闭一次挺慢的
                    is.flush();
                    is.close();
                }
                flag = true;
            } catch (IOException e) {
                e.printStackTrace();
            }  
            return flag;
        }
    
        
        
        
        public synchronized boolean upload(InputStream inputStream , String fileName , String path) {
            try {
                 
                //切换工作路径,设置上传的路径 
                ftpClient.changeWorkingDirectory(path);
                //设置1M缓冲
                 ftpClient.setBufferSize(1024);
                 // 设置被动模式
                 ftpClient.enterLocalPassiveMode();
                 // 设置以二进制方式传输
                 ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
                 /*
                  * 第一个参数:服务器端文档名 
                  * 第二个参数:上传文档的inputStream 
                  * 在前面设置好路径,缓冲,编码,文件类型后,开始上传
                  */
                 ftpClient.storeFile(fileName, inputStream);
                inputStream.close();
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            } finally {
                closeClient();
            }
             
        }
        
        public boolean checkSubfolder(String path, String subfolderName) {
            try {
                //切换到FTP根目录
                ftpClient.changeWorkingDirectory(path);
                //查看根目录下是否存在该文件夹
                InputStream is = ftpClient.retrieveFileStream(new String(subfolderName.getBytes("UTF-8")));
                if (is == null || ftpClient.getReplyCode() == FTPReply.FILE_UNAVAILABLE) {
                    //若不存在该文件夹,则创建文件夹
                    return createSubfolder(path,subfolderName);
                }
                if (is != null) {
                    is.close();
                    return true;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch(Exception e) {
                e.printStackTrace();
            }
            return false;
        }
        
        public synchronized boolean createSubfolder(String path,String subfolderName){
            try {
                ftpClient.changeWorkingDirectory(path);
                ftpClient.makeDirectory(subfolderName);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return true;
        }
        
        
        /**
         * 断开与远程服务器的连接
         */
        public void closeClient(){
            if (ftpClient != null && ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            
        }
        
    }

    测试类:

    package com.zit.test;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    
    import com.zit.util.FTPUtil;
    
    public class TestFTP {
    
        public static void main(String[] args) {
            
            FTPUtil ftpClient = new FTPUtil();
            ftpClient.connectServer();
            
            try {
                File file = new File("D:\test.doc");
                InputStream stream = new FileInputStream(file);
                String ftpPath = "D:\FTP";
                String fileName = "文件夹";
                boolean b = ftpClient.checkSubfolder(ftpPath, fileName);
                if(stream != null && b) {
                    ftpClient.upload(stream, "aaa.doc", fileName);
                }
                
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            
            
            
        }
    }

    实验工具:

    filezilla server(FTP服务端工具)

    官网下载即可

    步骤

    点击左上角小头像

    1、Add新增用户,输入用户名

    2、输入密码

    3、Share folders 共享文件夹,就是设置FTP根目录

    4、Add选择共享文件夹,在本地某文件夹即可

    5、勾选该文件夹用户的权限,都选上

    6、点击OK即可

     

    实验结果:

    运行测试类,即可看到,我已经把某个文档,上传到FTP根目录下了

  • 相关阅读:
    2008年假期
    Asp.Net viewstate , session , cookie區別
    C#类型 参考表(MSDN)
    GIS ftp
    gis 好书推荐
    c#应该怎么改进?
    ArcEngine开发体验(附许可)
    gis开源开发资料(持续更新)
    GIS API乱弹
    Autodesk Map3d的应用和开发
  • 原文地址:https://www.cnblogs.com/Donnnnnn/p/9596915.html
Copyright © 2020-2023  润新知