FTP下载远程服务器乱码文件夹以及文件夹下文件

问题描述:需要读取远程服务器文件,但是远程服务器文件所在目录存在乱码,导致无法进入文件所在目录读取文件!

实现思路:通过FTP下载并转码到本地服务器之后,解决掉乱码问题之后再读取文件夹下的文件。

 

复制代码
package com.guli.edu.FTPDown;

import com.guli.edu.excel.ExcelUtils02;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class FTPDownLoadRemoteFile {


    private static Logger logger =  LoggerFactory.getLogger("FTPDownLoadRemoteFile.class");

    public boolean downFile(String ip, int port, String username, String password, String remotePath, String fileName, String localPath) {
        boolean success = false;
        FTPClient ftpc = new FTPClient();
        String LOCAL_CHARSET="GBK";
        try {

            logger.info("连接ftp----");
            //ftpc.setCharset(Charset.forName("GBK"));

            //ftp中文编码设置
            ftpc.setControlEncoding("GBK");
            FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
            conf.setServerLanguageCode("zh");
            ftpc.configure(conf);

            int reply;
           // ftpc.connect(ip,port);
            logger.info("--------------连接ftp成功--------------");

            //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
            ftpc.connect(ip);
            ftpc.login(username, password);//登录
            reply = ftpc.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply)) {
                ftpc.disconnect();
                return success;
            }

            logger.info("切换路径:"+remotePath);
            FTPFile[] fs = ftpc.listFiles();
            //判断本地的日期路径是否存在
            File file = new File(localPath);
            //判断文件夹是否存在,如果不存在则创建文件夹
            if (!file.exists()) {
                file.mkdir();
            }
            downFilePathRecursion(ftpc,remotePath,localPath);
            ftpc.logout();
            success = true;
        }catch (Exception e){

            // e.printStackTrace();
            logger.error("ftp下载报错", e);

        }finally {

            if (ftpc.isConnected()) {
                try {
                    ftpc.disconnect();
                } catch (Exception ioe) {
                    ioe.printStackTrace();
                }
            }

        }
        return true;
    }




    //递归遍历下载文件、创建文件夹
    public void downFilePathRecursion( FTPClient ftpc,String remotePath,String localPath) {

        try {
            FTPFile[] fs = ftpc.listFiles();
            //判断本地的日期路径是否存在
            File file = new File(localPath);
            //判断文件夹是否存在,如果不存在则创建文件夹
            if (!file.exists()) {
                file.mkdir();
            }
            for (int i = 0; i < fs.length; i++){
                if (!fs[i].isDirectory()){//判断是否是文件夹 不是文件夹,则下载文件
                    logger.info("文件名称:"+fs[i].getName());
                    File localFile = new File(localPath+"/"+fs[i].getName());
                    OutputStream is = new FileOutputStream(localFile);
                    ftpc.retrieveFile(new String(fs[i].getName().getBytes("utf-8"), "GBK"), is);
                    is.close();
                    logger.info("下载完毕----");

                }else if (fs[i].isDirectory()){//判断是否是文件夹 是文件夹,则递归遍历
                    logger.info("文件夹名称:"+fs[i].getName());


                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
复制代码

 

 

参考连接:https://blog.csdn.net/weixin_33804990/article/details/93585653

 

 

 

 

 

 

 

 

 

 

 

参考连接:https://blog.csdn.net/weixin_33804990/article/details/93585653

posted @   拉稀的华莱士  阅读(160)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示