• 麒麟v10系统部署ftp,Java无法获取文件列表问题解决


    出现问题:

    Java连接ftp代码:

    1. ftpClient.connect(server, Integer.valueOf(port));
    2. ftpClient.login(loginName, loginPassword);
    3. log.info("连接ftp服务返回码:" + ftpClient.getReplyCode());
    4. ftpClient.setBufferSize(bufferSize);
    5. ftpClient.setControlEncoding(encoding);
    6. ftpClient.setFileType(FTPClient.EBCDIC_FILE_TYPE);
    7. ftpClient.enterLocalPassiveMode();

    当我用ftpClient连接麒麟服务器部署的FTP服务器时出现了获取不到文件列表的问题:

      FTPFile[] ftpFiles = ftpClient.listFiles();

     

     获取文件数组长度为0。

    但是使用FileZilla连接是正常的!!!

     

     使用FTP命令也可以正常连接!!!

    1. [root@bogon /]# ftp 192.168.100.11
    2. Connected to 192.168.100.11 (192.168.100.11).
    3. 220 Welcome to blah FTP service.
    4. Name (192.168.100.11:root): vsftp
    5. 331 Please specify the password.
    6. Password:
    7. 230 Login successful.
    8. Remote system type is UNIX.
    9. Using binary mode to transfer files.
    10. ftp> ls
    11. 227 Entering Passive Mode (192,168,100,11,42,244).
    12. 150 Here comes the directory listing.
    13. -rw-r--r-- 1 0 1014 0 8月 11 19:02 213213
    14. drwxr-xr-x 2 0 1014 6 8月 11 19:01 456546
    15. drwxr-xr-x 3 0 0 18 8月 11 14:52 data
    16. drwxr-xr-x 6 0 1014 58 8月 11 19:07 home
    17. -rw-r--r-- 1 0 1014 5562368 8月 11 18:56 images (3).tar
    18. drwxr-xr-x 3 0 1014 17 811 18:54 mnt
    19. drwxr-xr-x 5 0 0 49 811 10:30 portainer
    20. -rw-r--r-- 1 0 1014 0 8月 11 19:02 qweqwe
    21. drwxrwxrwx 2 0 0 6 8月 10 09:37 user
    22. drwxr-xr-x 3 0 0 23 8月 11 10:57 username
    23. drwxrwxrwx 17 1014 0 4096 8月 11 13:41 vsftp
    24. drwxr-xr-x 2 0 1014 6 8月 11 18:56 创建目录
    25. 226 Directory send OK.
    26. ftp>

     于是我开始打断点查看源码运行情况:

    直到发现了这里

     

    FTPFile temp = this.parser.parseFTPEntry(entry);

    entry是可以获取到文件字符串信息但无法解析

    1. 它本身是一个接口
    2. FTPFile parseFTPEntry(String var1);

     不同系统下有多个实现类

     而它默认使用的 UnixFTPEntryParser没有办法解析麒麟系统下的文件字符串!!!

    百度之后发现可以通过设置FTPClientConfig来设置系统编码解析类型

    1. public class FTPClientConfig {
    2. public static final String SYST_UNIX = "UNIX";
    3. public static final String SYST_UNIX_TRIM_LEADING = "UNIX_LTRIM";
    4. public static final String SYST_VMS = "VMS";
    5. public static final String SYST_NT = "WINDOWS";
    6. public static final String SYST_OS2 = "OS/2";
    7. public static final String SYST_OS400 = "OS/400";
    8. public static final String SYST_AS400 = "AS/400";
    9. public static final String SYST_MVS = "MVS";
    10. public static final String SYST_L8 = "TYPE: L8";
    11. public static final String SYST_NETWARE = "NETWARE";
    12. public static final String SYST_MACOS_PETER = "MACOS PETER";

    经过多次尝试:

    1. FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
    2. ftpClient.configure(conf);

    发现这样是可行的!!!

     完美。

    连接代码

    1. ftpClient.connect(server, Integer.valueOf(port));
    2. ftpClient.login(loginName, loginPassword);
    3. log.info("连接ftp服务返回码:" + ftpClient.getReplyCode());
    4. ftpClient.setBufferSize(bufferSize);
    5. ftpClient.setControlEncoding(encoding);
    6. ftpClient.setFileType(FTPClient.EBCDIC_FILE_TYPE);
    7. ftpClient.enterLocalPassiveMode();
    8. FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_NT);
    9. ftpClient.configure(conf);
    10. // 使用被动模式设为默认
    11. ftpClient.enterLocalPassiveMode();
  • 相关阅读:
    Android Media Framework(一)OpenMAX 框架简介
    正版软件|WonderFox Photo Watermark 图片水印批量处理软件
    [DeepLearning] 线性回归的实现Pytorch
    数据结构与算法04:队列
    java需要学习的基础语法
    Win10系统无法登录Xbox live的四种解决方法
    Nginx ngx_http_auth_request_module模块鉴权【下】携带账号密码登录
    什么品牌的台灯护眼比较好?推荐护眼效果好的护眼灯品牌
    黑马瑞吉外卖之菜品信息的修改
    springboot上传word/doc/docx文档(含图片)与HTML富文本导入/导出互相转换解析!超级硬核qaq
  • 原文地址:https://blog.csdn.net/qq_43159578/article/details/126296870