zoukankan      html  css  js  c++  java
  • java实现连接Ftp上传下载文件

    1、引入Maven依赖

    <!-- ftp依赖包 -->
    <dependency>
       <groupId>commons-net</groupId>
       <artifactId>commons-net</artifactId>
       <version>3.6</version>
    </dependency>

    2、实现代码如下

    package com.chenly.ftp.bokeyuan;
    
    import org.apache.commons.net.ftp.FTPClient;
    
    import java.io.*;
    import java.nio.charset.StandardCharsets;
    
    /**
     * @author: void
     * @date: 2021-09-16 11:47
     * @description:
     * @version: 1.0
     */
    public class FtpUtil {
    
        private String host = "192.169.2.14";
        private int port = 21;
        private String username = "root";
        private String password = "123456";
        private String basePath = "/root/";
    
    
        public static void main(String[] args) {
            FtpUtil ftpUtil = new FtpUtil();
            //上传文件
            ftpUtil.uploadFile();
            //下载文件
            ftpUtil.downLoadFile();
    
            //写文件
            ftpUtil.writeFile();
            //读文件
            ftpUtil.readFile();
            //删除文件
            ftpUtil.deleteFile();
    
        }
    
    
        /**
         * 建立连接,登录
         * @return
         */
        public  FTPClient connectAndLogin(){
            FTPClient ftpClient = new FTPClient();
            try {
                //连接服务器
                ftpClient.connect(host,port);
                //登录
                boolean flag = ftpClient.login(username,password);
                if(flag){
                    System.out.println("建立连接,登录成功");
                    return ftpClient;
                }else{
                    System.out.println("登录ftp失败");
                    return null;
                }
    
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    
    
        /**
         * 退出登录,断开连接
         * @param ftpClient
         */
        public  void logoutAndDisconnect(FTPClient ftpClient){
            if(ftpClient!=null && ftpClient.isConnected()){
                try {
                    //退出登录
                    ftpClient.logout();
                    //断开连接
                    ftpClient.disconnect();
                    System.out.println("退出登录,断开连接");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
    
        /***
         * 上传文件
         */
        public void uploadFile(){
            FtpUtil ftpUtil = new FtpUtil();
            FTPClient ftpClient = ftpUtil.connectAndLogin();
            if(ftpClient == null){
                return;
            }
            //本地文件
            File file = new File("E:\javaproject\ideaProject\demo\file-demo\测试.txt");
    
            //文件上传的ftp服务器目录
            String ftpPath = "/ftp/测试目录/";
            //将目录名称转为iso-8859-1编码 (FTP协议里面,规定文件名编码为iso-8859-1)
            String validPath = new String(ftpPath.getBytes(), StandardCharsets.ISO_8859_1);
    
            //文件上传到ftp的文件名
            String fileName = "测试.txt";
            // FTP协议里面,规定文件名编码为iso-8859-1
            String ftpFileName = new String(fileName.getBytes(),StandardCharsets.ISO_8859_1);
    
            //文件输入流 FileIntPutStream
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(file);
                //设置缓冲区大小 4M
                ftpClient.setBufferSize(4*1024*1024);
                //设置编码
                ftpClient.setControlEncoding("utf-8");
    
                boolean changeWorkDirFlag = ftpClient.changeWorkingDirectory(basePath+validPath);
                if(!changeWorkDirFlag){
                    //创建子目录
                    createDirectory(ftpClient,validPath);
                }
                //存储文件至ftp服务器
                boolean flag = ftpClient.storeFile(ftpFileName,fis);
                System.out.println("上传文件"+(flag?"成功":"失败"));
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                ftpUtil.logoutAndDisconnect(ftpClient);
            }
    
    }
    
    
        /**
         *
         * 在根目录下创建目录,我自己搭建的vsftp服务器根目录是/root,因此是在/root下创建目录
         * @param ftpClient ftp客户端
         * @param directory 文件目录,将在根目录下创建
         */
        public static void createDirectory(FTPClient ftpClient,String directory) {
    
            String fileSeparator = "/";
            if (!directory.endsWith(fileSeparator)) {
                directory += fileSeparator;
            }
            int fromIndex = 0;
            int endIndex = 0;
            try {
                if(ftpClient.changeWorkingDirectory(directory)){
                    //如果目录存在,直接返回
                    return;
                }
                if (directory.startsWith(fileSeparator)) {
                    fromIndex = 1;
                }
                endIndex = directory.indexOf(fileSeparator, fromIndex);
                while (true) {
                    String subDirectory = new String(directory.substring(fromIndex, endIndex));
                    if (!ftpClient.changeWorkingDirectory(subDirectory)) {
                        if (ftpClient.makeDirectory(subDirectory)) {
                            ftpClient.changeWorkingDirectory(subDirectory);
                        } else {
                            System.out.println("创建"+subDirectory+"目录失败");
                            return;
                        }
                    }
                    fromIndex = endIndex + 1;
                    endIndex = directory.indexOf(fileSeparator, fromIndex);
                    //检查所有目录是否创建完毕
                    if (endIndex <= fromIndex) {
                        break;
                    }
                }
                System.out.println("上传目录创建成功");
            } catch (Exception e) {
                System.out.println("上传目录创建失败");
                e.printStackTrace();
            }
        }
    
        /**
         * 下载文件
         */
        public void downLoadFile(){
            FtpUtil ftpUtil = new FtpUtil();
            FTPClient ftpClient = ftpUtil.connectAndLogin();
            if(ftpClient == null){
                return;
            }
            //ftp服务器文件名
            String ftpFilePath = basePath+"ftp/测试目录/测试.txt";
            String validFtpFilePath = new String(ftpFilePath.getBytes(),StandardCharsets.ISO_8859_1);
            //下载到本地地址
            String localPath = "E:\javaproject\ideaProject\demo\file-demo\从ftp下载.txt";
            try {
                OutputStream os = new FileOutputStream(localPath);
                //1、检查文件是否存在
                if(!isFileExist(ftpFilePath,ftpClient)){
                    System.out.println("文件不存在");
                    return;
                }
                boolean flag = ftpClient.retrieveFile(validFtpFilePath,os);
                System.out.println("下载文件"+(flag?"成功":"失败"));
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                ftpUtil.logoutAndDisconnect(ftpClient);
            }
    
        }
    
    
        /**
         * 判断文件是否存在
         * @param ftpFile
         * @param ftpClient
         * @return
         */
        public Boolean isFileExist(String ftpFile, FTPClient ftpClient) {
            if (ftpClient != null) {
                try {
                    String validFtpFile = new String(ftpFile.getBytes(),StandardCharsets.ISO_8859_1);
                    String path = validFtpFile.substring(0,validFtpFile.lastIndexOf("/"));
                    String fileName = validFtpFile.substring(validFtpFile.lastIndexOf("/")+1);
                    // 判断是否存在该目录
                    boolean changeWorkDirFlag = ftpClient.changeWorkingDirectory(path);
                    if (!changeWorkDirFlag) {
                        System.out.println("目录不存在");
                        return false;
                    }
                    ftpClient.enterLocalPassiveMode();  // 设置被动模式,开通一个端口来传输数据
                    String[] fs = ftpClient.listNames();
                    // 判断该目录下是否有文件
                    if (fs == null || fs.length == 0) {
                        System.out.println("该目录下没有文件");
                        return false;
                    }
                    for (String ftpName : fs) {
                        if (ftpName.equals(fileName)) {
                            return true;
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return false;
        }
    
    
        /**
         * 删除文件
         */
        public void deleteFile(){
            FtpUtil ftpUtil = new FtpUtil();
            FTPClient ftpClient = ftpUtil.connectAndLogin();
            if(ftpClient == null){
                return;
            }
            String fileName = "/root/ftp/测试目录/测试.txt";
            String validFileName = new String(fileName.getBytes(), StandardCharsets.ISO_8859_1);
            boolean flag ;
            try {
                flag = ftpClient.deleteFile(validFileName);
                System.out.println("文件删除结果:"+flag);
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                ftpUtil.logoutAndDisconnect(ftpClient);
            }
        }
    
    
        /**
         * 写文件
         */
        public void writeFile(){
            FtpUtil ftpUtil = new FtpUtil();
            FTPClient ftpClient = ftpUtil.connectAndLogin();
            if(ftpClient == null){
                return;
            }
    
            String content = "写入ftp服务器上文件内容";
            String fileName = basePath+"/ftp/存储到ftp文件名.txt";
            String validFileName = new String(fileName.getBytes(),StandardCharsets.ISO_8859_1);
            //将content转为输入流
            ByteArrayInputStream is = new ByteArrayInputStream(content.getBytes());
            try {
                boolean flag =  ftpClient.storeFile(validFileName,is);
                System.out.println("写文件至ftp"+(flag?"成功":"失败"));
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                ftpUtil.logoutAndDisconnect(ftpClient);
            }
    
        }
    
        /**
         * 读文件
         */
        public void readFile(){
            FtpUtil ftpUtil = new FtpUtil();
            FTPClient ftpClient = ftpUtil.connectAndLogin();
            if(ftpClient == null){
                return;
            }
            String fileName = basePath+"ftp/测试目录/测试.txt";
            String validFileName = new String(fileName.getBytes(),StandardCharsets.ISO_8859_1);
            try {
                if(!isFileExist(fileName,ftpClient)){
                    System.out.println("文件不存在");
                    return;
                }
                InputStream inputStream = ftpClient.retrieveFileStream(validFileName);
                //将输入流转为字符串
                InputStreamReader reader = new InputStreamReader(inputStream);
                BufferedReader bufferedReader = new BufferedReader(reader);
                String line;
                System.out.println("读取文件内容为:");
                while ((line = bufferedReader.readLine()) !=null){
                    //文件内容
                    System.out.println(line);
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                ftpUtil.logoutAndDisconnect(ftpClient);
            }
    
    
        }
    
    
    }

    相关内容:

    LINUX搭建VSFTP服务器

    作者:小念
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    做了一些心理学的测试,分析下个人
    做了一些心理学的测试,分析下个人
    逆转一个整数
    打印九九乘法表
    计算两个日期相差多少天
    struct的使用
    Linux Vim替换字符串的一些方法小结
    CentOS里vim基本操作
    如何创建一个后台进程
    高中是个把人分类的机器(转)
  • 原文地址:https://www.cnblogs.com/kiko2014551511/p/15304524.html
Copyright © 2011-2022 走看看