IT评测·应用市场-qidao123.com技术社区

标题: 踩坑之《FTPClient.listFiles()不能获取文件》 [打印本页]

作者: 水军大提督    时间: 2024-12-19 20:11
标题: 踩坑之《FTPClient.listFiles()不能获取文件》
在做一件什么事情

当时做在做一个文件上传下载的功能,其中涉及到的是存储FTP服务器。这个系统是某司的内部系统,我们在七楼开发调试,完是到三楼部署。
遇到了什么问题

当时就遇到了一个很奇怪的问题。问题现象是获取列表的时候,返回数据为空,偶然候还会提示链接断开。这个问题坑的我和向导楼上楼下跑了七八趟。
  1. ftpUtilsInst.list(path);
复制代码
问题分析

连接断开容易办理,断开了为重新连接就可以了。
一开始猜想是应该有个参数可以配置对应的连接时间,效果发现还真有。
  1.    /**
  2.      * Sets the connection timeout in milliseconds, which will be passed to the {@link Socket} object's
  3.      * connect() method.
  4.      * @param connectTimeout The connection timeout to use (in ms)
  5.      * @since 2.0
  6.      */
  7.     public void setConnectTimeout(int connectTimeout) {
  8.         this.connectTimeout = connectTimeout;
  9.     }
复制代码
但是问题还是没有办理,就算是这个时间你设置的很长,最终还是有断开连接的一天。
那我们就自己封装一层,每次使用的使用重新建立连接⬇︎⬇︎⬇︎⬇
  1. public FTPFile[] list(String path) throws IOException {
  2.         FTPFile[] listFiles = null;
  3.         try {
  4.             listFiles = ftpUtilsInst.list(path);
  5.         } catch (FTPConnectionClosedException e) {
  6.             logger.error("ftp closed: {}", e);
  7.             if (ftpUtilsInst.connect()) {
  8.                 listFiles = ftpUtilsInst.list(path);
  9.             } else {
  10.                 throw e;
  11.             }
  12.         }
  13.         return listFiles;
  14.     }
复制代码
这样就把连接断开的问题办理了
目录下面有数据,但返回列表为空

原因是由于FTP有两种工作模式。一种是自动模式,一种是被动模式。
最终的方案

在每次客户端连接的时候,就要告诉服务器,我们是被动方式连接,添加这行代码设置:
  1. //设置为被动模式
  2. ftpClient.enterLocalPassiveMode();
复制代码
注意:ftp server可能每次开启差别的端口来传输数据,但是在linux 上,由于安全限制,可能某些端口没有开启,所以就出现阻塞。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4