• 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服务器上的文件,可根据需求自行调用;

  • 相关阅读:
    CATransition
    OC中只有重写没有重载
    OC内存管理
    NSNotification
    关于一个小应用软件的思考
    tableView主从表在storyboard连线是 Selcetion Segue和Accessory Action的区别
    关于ios8模拟器不能输入中文问题以及软键盘不弹出问题
    UINavigation Bar中使用UIcollectionView,在UIcollectionView的顶端和低端出现空白的问题
    升级到Xcode6.2后 免证书真机调试出错的问题
    让UITableView 的 headerView跟随 cell一起滚动,tableHeaderView
  • 原文地址:https://www.cnblogs.com/luzhanshi/p/12066221.html
Copyright © 2020-2023  润新知