java 实现ftp文件的获取跟下载

简介: SpringBoot 中实现从ftp文件服务器中获取文件。 import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.

SpringBoot 中实现从ftp文件服务器中获取文件。

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 org.springframework.stereotype.Component;

import java.io.*;

/**
 * Created by IntelliJ IDEA.
 * Project: sits-hbc-collect
 * User : chenlong
 * Date : 17/07/11
 * Time : 14:38
 */
@Component
public class FtpClient {
    protected static Logger logger = Logger.getLogger(FtpClient.class);
    /**
     * 本地字符编码
     */
    private static String LOCAL_CHARSET = "GBK";

    // FTP协议里面,规定文件名编码为iso-8859-1
    private static String SERVER_CHARSET = "ISO-8859-1";


    /**
     * Description: 从FTP服务器下载文件
     *
     * @param url        FTP服务器hostname
     * @param port       FTP服务器端口
     * @param username   FTP登录账号
     * @param password   FTP登录密码
     * @param remotePath FTP服务器上的相对路径
     * @param fileName   要下载的文件名
     * @param localPath  下载后保存到本地的路径
     * @return
     * @Version. Jul , :: PM by 陈龙 创建
     */
    public boolean downFile(String url, int port, String username, String password, String remotePath, String fileName, String localPath) {
        String myCharset = System.getProperty("file.encoding");//查看系统编码
        logger.info("================file.encoding:"+myCharset);
        boolean success = false;
        FTPClient ftp = new FTPClient();
        try {
            //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            boolean login = login(ftp, url, port, username, password);//登录
            if (login) {
                if (remotePath.startsWith("/") && remotePath.endsWith("/")) {
                    String p = new String(remotePath.getBytes("gbk"), ftp.DEFAULT_CONTROL_ENCODING);
                    logger.info("================remotePath:"+p);
                    System.out.println(p);
                    boolean path = ftp.changeWorkingDirectory(new String(remotePath.getBytes(LOCAL_CHARSET), ftp.DEFAULT_CONTROL_ENCODING));//转移到FTP服务器目录
                    if (!path) {
                        logger.error("ftp 服务器进入路径:" + remotePath + " 失败!");
                    } else {
                        logger.info("ftp 服务器进入路径:" + remotePath + " 成功!");
                        System.out.println("进入黄标车路径成功");
                        list(ftp, fileName, localPath);
                    }
                }
            }
            ftp.logout();
            success = true;
        } catch (IOException e) {
            e.printStackTrace();
            logger.error("ftp 服务器:" + e.getMessage());
        } finally {
            if (ftp.isConnected()) {
                try {
                    ftp.disconnect();
                } catch (IOException ioe) {
                    logger.error(ioe.getMessage());
                }
            }
        }
        logger.info("outside文件获取成功!");
        try {
            disConnection(ftp);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return success;
    }

    /**
     * 登陆FTP服务器
     *
     * @param ftp
     * @param host     FTPServer IP地址
     * @param port     FTPServer 端口
     * @param username FTPServer 登陆用户名
     * @param password FTPServer 登陆密码
     * @return 是否登录成功
     * @throws IOException
     */
    public static boolean login(FTPClient ftp, String host, int port, String username, String password) throws IOException {
        ftp.connect(host, port);
        if (FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
            if (ftp.login(username, password)) {
                if (FTPReply.isPositiveCompletion(ftp.sendCommand("OPTS UTF8", "ON"))) {// 开启服务器对UTF-8的支持,如果服务器支持就用UTF-8编码,否则就使用本地编码(GBK).
                    LOCAL_CHARSET = "UTF-8";
                }
                ftp.setControlEncoding(LOCAL_CHARSET);
                ftp.enterLocalActiveMode();// 设置主动模式
                return true;
            }
        }
        if (ftp.isConnected()) {
            ftp.disconnect();
        }
        return false;
    }

    /**
     * 关闭数据链接
     *
     * @param ftp
     * @throws IOException
     */
    public void disConnection(FTPClient ftp) throws IOException {
        if (ftp.isConnected()) {
            ftp.disconnect();
        }
    }
private void list(FTPClient ftp, String fileName, String localPath) {
        try {
            ftp.printWorkingDirectory();
            FTPFile[] fs = ftp.listFiles();
            for (FTPFile ff : fs) {
                // 提取绝对地址的目录以及文件名
                logger.info("ftp get fire name ========================:" + ff.getName());
                // 进入文件所在目录,注意编码格式,以能够正确识别中文目录
                //排除前两层目录
                if (ff.getName().equals(".") || ff.getName().equals("..")) {
                    continue;
                } else if (ff.isFile()) {
                    String fileN = ff.getName().substring(0, 8);
                    if (fileN.equals(fileName)) {
                        File localFile = new File(localPath + ff.getName());
                        OutputStream is = new FileOutputStream(localFile);
                        ftp.retrieveFile(ff.getName(), is);
                        is.flush();
                        is.close();
                    }
                } else if (ff.isDirectory()) {
                    String file = ff.getName();
                    logger.info("ftp ff.getName().length():" + file.length());
                    String fileN = ff.getName().substring(file.length() - 8, file.length());
                    System.out.println(fileN);
                    if (fileN.equals(fileName)) {
                        boolean path = ftp.changeWorkingDirectory(new String(file.getBytes(LOCAL_CHARSET), ftp.DEFAULT_CONTROL_ENCODING));//转移到FTP服务器目录
                        if (path){
                            list(ftp, fileName, localPath);
                        }else{
                            logger.error("ftp 服务器进入路径:" + ff.getName() + " 失败!");
                        }
                    }
                }
            }
        } catch (Exception e) {
            logger.error("ftp 服务器错误:" + e.getMessage());
        }
    }
}
相关文章
|
3天前
|
JavaScript Java Android开发
在cmd中运行javac编译java文件报错: 编码GBK的不可映射字符、 非法字符: \65279
在cmd中运行javac编译java文件报错: 编码GBK的不可映射字符、 非法字符: \65279
12 1
|
4天前
|
网络协议 JavaScript 前端开发
Java一分钟之-GraalVM Native Image:构建原生可执行文件
【6月更文挑战第13天】GraalVM Native Image是Java开发的创新技术,它将应用编译成独立的原生可执行文件,实现快速启动和低内存消耗,对微服务、桌面应用和嵌入式系统有重大影响。本文讨论了如何使用Native Image,包括常见挑战如反射与动态类加载、静态初始化问题和依赖冲突,并提供了解决方案和代码示例。通过合理规划和利用GraalVM工具,开发者可以克服这些问题,充分利用Native Image提升应用性能。
29 5
|
2天前
|
Java
创建java文件 自动添加作者、时间等信息 – IDEA 技巧
创建java文件 自动添加作者、时间等信息 – IDEA 技巧
4 0
|
2天前
|
Java
java 文件读写实例
java 文件读写实例
|
3天前
|
Java Maven
Java 怎样从 excel 中读取文件、写入文件
Java 怎样从 excel 中读取文件、写入文件
10 0
|
4天前
|
Java
Java读取txt文件和写入txt文件-多种方法-java读写文件-java读写
Java读取txt文件和写入txt文件-多种方法-java读写文件-java读写
16 0
|
4天前
|
IDE 数据可视化 Java
Java基础6-Java文件和Java包结构和常用的jar包(二)
Java基础6-Java文件和Java包结构和常用的jar包(二)
12 0
|
4天前
|
Java Unix 编译器
Java基础6-Java文件和Java包结构和常用的jar包(一)
Java基础6-Java文件和Java包结构和常用的jar包(一)
16 0
|
6天前
|
分布式计算 大数据 Java
MaxCompute产品使用合集之如何通过Java SDK下载
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
7天前
|
存储 Java 测试技术
《手把手教你》系列技巧篇(六十九)-java+ selenium自动化测试 - 读取csv文件(详细教程)
【6月更文挑战第10天】本文介绍了如何在Java中读取CSV文件。首先解释了CSV是逗号分隔值的文本文件,常用于数据交换。接着,在项目实战部分,详细说明了如何通过下载并引入opencsv库来读取CSV文件:包括下载jar包、添加到Eclipse项目、创建CSV文件、编写Java代码读取文件内容,并展示了代码执行后的输出结果。文章以一个简单的代码示例展示了如何使用opencsv读取CSV文件中的数据。
10 0