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

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());
        }
    }
}

时间: 2024-08-02 05:48:49

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

Java实现ftp文件上传下载解决慢中文乱码多个文件下载等问题_java

废话不多说了,直接给大家贴代码了,具体代码如下所示: //文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String path,String filename,InputStream input) { boolean success=false; FTPClient ftp=new FTPClient();//org.apache.commons.net.ftp

Java实现FTP文件的上传和下载功能的实例代码_java

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件.在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)."下载"文件就是从远程主机拷贝文件至自己

java实现FTP文件上传与文件下载_java

本文实例为大家分享了两种java实现FTP文件上传下载的方式,供大家参考,具体内容如下 第一种方式: package com.cloudpower.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import sun.net.TelnetInputStream; import sun.net.TelnetO

Android关于FTP文件上传和下载功能详解

本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 此篇博客为整理文章,供大家学习. 1.首先下载commons-net  jar包,可以百度下载. FTP的文件上传和下载的工具类: package ryancheng.example.progressbar; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.Outpu

java实现服务器文件打包zip并下载的示例(边打包边下载)_java

使用该方法,可以即时打包文件,一边打包一边传输,不使用任何的缓存,让用户零等待! 复制代码 代码如下: /** *  * mySocket 客户端 Socket * @param file 待打包的文件夹或文件 * @param fileName 打包下载的文件名 * @throws IOException */ private void down(File file, String fileName) throws IOException { OutputStream outputStream

用Java从XML文件中获取业务图表

数据的图解表示法是一个热门的话题.我们翻阅杂志,可以看到很多公司提供复杂的图形程序包,可以让你处理你的数据并使之可视化. 这些程序包有一个公共的问题:它们要求在它们可以把你的数据形成图表之前,你必须把你的XML数据格式化成一种它们能够读懂的特定的格式. 这样的话,XML有力的灵活性就被埋没了,因为你必须改换数据格式--通常使用XSLT. 这并不总是想看上去那么微不足道的,因为有时开发者必须从第三方的数据源获得XML文件,然后在把这些XML文件发送到客户之前给它们添加图表. 举例来说吧,一个金融服

java 用ftp文件上传

问题描述 用ftp把文件从我的机器传到另一台机器,对方的机器用作什么么?谢谢大家有点急 解决方案 这个...ftp应该是装在对方的机子吧,然后你在去操作他的ftp,把文件传过去啊解决方案二:对方的机器用作ftp服务器

EDI中JAVA通过FTP工具实现文件上传下载实例_java

最近接手一个EDI项目,收获颇多.其实我在第一家公司是接触过EDI的,当初我们用EDI主要实现了订单数据传输,客户向我们下达采购订单,通过VPN及FTP工具将采购订单以约定的报文形式放到指定的文件服务器中,然后我们EDI系统会定时去文件服务器中获取报文,最后解析并生成我们的销售订单.这些年过去了,我仍记着当初用的最多的是EDI850.EDI855.  一.首先介绍一下EDI的概念 Electronic data interchange,电子数据交换. EDI其实就是把原来纸质的订单/发货通知等业

java ftp-java如何实现ftp文件的批量下载以及文件的移动

问题描述 java如何实现ftp文件的批量下载以及文件的移动 FTP服务器下有两个文件夹:current.history 1.如何实现下载FTP服务器current文件夹下的所有文件,并将current文件夹下的所有文件移动到history文件下. 解决方案 java实现ftp下载文件ftp上传和下载文件的java实现Java 实现ftp文件的上传和下载 解决方案二: http://www.cnblogs.com/chen1987lei/archive/2010/11/03/1867668.ht