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());
        }
    }
}
相关文章
|
23天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
64 2
|
27天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
49 2
|
1月前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
42 4
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
41 4
|
1月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
40 5
|
1月前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
67 5
|
2月前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
110 6
|
2月前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
315 1
|
2月前
|
监控 Java
Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
【10月更文挑战第13天】Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
134 1
|
2月前
|
缓存 Java 程序员
Java|SpringBoot 项目开发时,让 FreeMarker 文件编辑后自动更新
在开发过程中,FreeMarker 文件编辑后,每次都需要重启应用才能看到效果,效率非常低下。通过一些配置后,可以让它们免重启自动更新。
37 0