zoukankan      html  css  js  c++  java
  • JAVA通过FTP方式向远程服务器或者客户端上传、下载文件,以及删除FTP服务器上的文件

    1、在目标服务器上搭建FTP服务器

    搭建方式有多种大家可以自行选择,例如使用Serv-U或者FTPServer.exe;这里我以FTPServer.exe为例搭建;在目标服务器(这里对应的IP是10.8.66.22)上运行FTPServer.exe并按照下图设置:

     2、项目确保导入相应jar包:

    apache的commons-net包:

    maven项目导入下面的依赖即可:

            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.6</version>
            </dependency>

    3、编写FTP工具类:

    新建类名为FTPUtils的class,并将下面所有的代码黏贴进去:

    package com.yxjr.mytest;
    
    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 com.yxjr.common.utils.UUIDUtils;
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;
    
    /**
     * FTP服务器工具类
     */
    public class FTPUtils {
    
        /**
         * 上传文件至FTP服务器
         *
         * @param url       服务器IP地址
         * @param port      服务器端口
         * @param userName  用户登录名
         * @param password  用户登录密码
         * @param storePath 服务器文件存储路径
         * @param fileName  服务器文件存储名称
         * @param is        文件输入流
         * @return <b>true</b>:上传成功
         * <br/>
         * <b>false</b>:上传失败
         */
        public static boolean storeFile(String url, int port, String userName, String password, String storePath, String fileName, InputStream is) {
            boolean result = false;
            FTPClient ftp = new FTPClient();
            try {
                // 连接至服务器,端口默认为21时,可直接通过URL连接
                ftp.connect(url, port);
                // 登录服务器
                ftp.login(userName, password);
                // 判断返回码是否合法
                if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
                    // 不合法时断开连接
                    ftp.disconnect();
                    // 结束程序
                    return result;
                }
                // 判断ftp目录是否存在,如果不存在则创建目录,包括创建多级目录
                String s = "/" + storePath;
                String[] dirs = s.split("/");
                ftp.changeWorkingDirectory("/");
                //按顺序检查目录是否存在,不存在则创建目录
                for (int i = 1; dirs != null && i < dirs.length; i++) {
                    if (!ftp.changeWorkingDirectory(dirs[i])) {
                        if (ftp.makeDirectory(dirs[i])) {
                            if (!ftp.changeWorkingDirectory(dirs[i])) {
                                return false;
                            }
                        } else {
                            return false;
                        }
                    }
                }
                // 设置文件操作目录
                ftp.changeWorkingDirectory(storePath);
                // 设置文件类型,二进制
                ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
                // 设置缓冲区大小
                ftp.setBufferSize(3072);
                // 上传文件
                result = ftp.storeFile(fileName, is);
                // 关闭输入流
                is.close();
                // 登出服务器
                ftp.logout();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    // 判断输入流是否存在
                    if (null != is) {
                        // 关闭输入流
                        is.close();
                    }
                    // 判断连接是否存在
                    if (ftp.isConnected()) {
                        // 断开连接
                        ftp.disconnect();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return result;
        }
    
        /**
         * 从FTP服务器下载文件至本地
         *
         * @param url        服务器IP地址
         * @param port       服务器端口
         * @param userName   用户登录名
         * @param password   用户登录密码
         * @param remotePath 服务器文件存储路径
         * @param fileName   服务器文件存储名称
         * @param localPath  本地文件存储路径
         * @return <b>true</b>:下载成功
         * <br/>
         * <b>false</b>:下载失败
         */
        public static boolean retrieveFile(String url, int port, String userName, String password, String remotePath, String fileName, String localPath) {
            boolean result = false;
            FTPClient ftp = new FTPClient();
            OutputStream os = null;
            try {
                // 连接至服务器,端口默认为21时,可直接通过URL连接
                ftp.connect(url, port);
                // 登录服务器
                ftp.login(userName, password);
                // 判断返回码是否合法
                if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
                    // 不合法时断开连接
                    ftp.disconnect();
                    // 结束程序
                    return result;
                }
                // 设置文件操作目录
                ftp.changeWorkingDirectory(remotePath);
                // 设置文件类型,二进制
                ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
                // 设置缓冲区大小
                ftp.setBufferSize(3072);
                // 设置字符编码
                ftp.setControlEncoding("UTF-8");
                // 构造本地文件对象
                File localFile = new File(localPath + "/" + fileName);
                // 获取文件操作目录下所有文件名称
                String[] remoteNames = ftp.listNames();
                // 循环比对文件名称,判断是否含有当前要下载的文件名
                for (String remoteName : remoteNames) {
                    if (fileName.equals(remoteName)) {
                        result = true;
                    }
                }
                // 文件名称比对成功时,进入下载流程
                if (result) {
                    // 构造文件输出流
                    os = new FileOutputStream(localFile);
                    // 下载文件
                    result = ftp.retrieveFile(fileName, os);
                    // 关闭输出流
                    os.close();
                }
                // 登出服务器
                ftp.logout();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    // 判断输出流是否存在
                    if (null != os) {
                        // 关闭输出流
                        os.close();
                    }
                    // 判断连接是否存在
                    if (ftp.isConnected()) {
                        // 断开连接
                        ftp.disconnect();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return result;
        }
    
        /**
         * 从FTP服务器删除文件
         *
         * @param url        服务器IP地址
         * @param port       服务器端口
         * @param userName   用户登录名
         * @param password   用户登录密码
         * @param remotePath 服务器文件存储路径
         * @param fileName   服务器文件存储名称
         * @return <b>true</b>:删除成功
         * <br/>
         * <b>false</b>:删除失败
         */
        public static boolean deleteFile(String url, int port, String userName, String password, String remotePath, String fileName) {
            boolean result = false;
            FTPClient ftp = new FTPClient();
            try {
                // 连接至服务器,端口默认为21时,可直接通过URL连接
                ftp.connect(url, port);
                // 登录服务器
                ftp.login(userName, password);
                // 判断返回码是否合法
                if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
                    // 不合法时断开连接
                    ftp.disconnect();
                    // 结束程序
                    return result;
                }
                // 设置文件操作目录
                ftp.changeWorkingDirectory(remotePath);
                // 设置文件类型,二进制
                ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
                // 设置缓冲区大小
                ftp.setBufferSize(3072);
                // 设置字符编码
                ftp.setControlEncoding("UTF-8");
                // 获取文件操作目录下所有文件名称
                String[] remoteNames = ftp.listNames();
                // 循环比对文件名称,判断是否含有当前要下载的文件名
                for (String remoteName : remoteNames) {
                    if (fileName.equals(remoteName)) {
                        result = true;
                    }
                }
                // 文件名称比对成功时,进入删除流程
                if (result) {
                    // 删除文件
                    result = ftp.deleteFile(fileName);
                }
                // 登出服务器
                ftp.logout();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    // 判断连接是否存在
                    if (ftp.isConnected()) {
                        // 断开连接
                        ftp.disconnect();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return result;
        }
    
        public static void main(String[] args) throws FileNotFoundException {
            try {
                FileInputStream fis = new FileInputStream(new File("C:\Users\Administrator\Desktop\太行后台socket发送工具1.txt"));
                System.out.println(storeFile("10.8.66.22", 21, "admin", "1", "D:\FTP\test", UUIDUtils.randomUUID() + ".txt", fis));
    
    //            File file = new File("D:\upload\20191217070411_start.txt");
    //            InputStream is = new FileInputStream(file);
    //            System.out.println(storeFile("10.8.66.22", 21, "admin", "1", "D:\FTP\test", "2.txt", is));
    //            System.out.println(retrieveFile("10.8.66.22", 21, "admin", "1", "D:\FTP\test", "2.txt", "D:\upload"));
    //            System.out.println(deleteFile("10.8.66.22", 21, "admin", "1", "D:\FTP\test", "2.txt"));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
    
        }
    
    }

    上面的工具类定义了三个方法,分别支持上传文件,下载文件,删除FTP服务器上的文件,可根据需求自行调用;

  • 相关阅读:
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    PHP extract() 函数
    PHP end() 函数
    PHP each() 函数
    PHP current() 函数
  • 原文地址:https://www.cnblogs.com/luzhanshi/p/12066221.html
Copyright © 2011-2022 走看看