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());
        }
    }
}
相关文章
|
12天前
|
Java
Java“解析时到达文件末尾”解决
在Java编程中,“解析时到达文件末尾”通常指在读取或处理文件时提前遇到了文件结尾,导致程序无法继续读取所需数据。解决方法包括:确保文件路径正确,检查文件是否完整,使用正确的文件读取模式(如文本或二进制),以及确保读取位置正确。合理设置缓冲区大小和循环条件也能避免此类问题。
|
17天前
|
Java
利用GraalVM将java文件变成exe可执行文件
这篇文章简明地介绍了如何使用GraalVM将一个简单的Java程序编译成exe可执行文件,首先通过javac命令编译Java文件生成class文件,然后使用native-image命令将class文件转换成独立的exe文件,并展示了如何运行这个exe文件。
33 0
利用GraalVM将java文件变成exe可执行文件
|
4天前
|
Java
Java开发如何实现文件的移动,但是在移动结束后才进行读取?
【10月更文挑战第13天】Java开发如何实现文件的移动,但是在移动结束后才进行读取?
15 2
|
4天前
|
Java Apache Maven
Java将word文档转换成pdf文件的方法?
【10月更文挑战第13天】Java将word文档转换成pdf文件的方法?
13 1
|
4天前
|
监控 Java
Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
【10月更文挑战第13天】Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
17 1
|
8天前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
21 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
9天前
|
网络安全 Windows
Jetson 学习笔记(十五):FTP协议传输文件
本文介绍了如何使用WinSCP软件通过FTP协议在Windows和Jetson设备之间传输文件,并分享了一些操作经验和技巧。
14 0
Jetson 学习笔记(十五):FTP协议传输文件
|
14天前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
47 2
|
16天前
|
XML JavaScript Java
java与XML文件的读写
java与XML文件的读写
16 3
|
15天前
|
Java
java 文件上传和下载
java 文件上传和下载
15 0