ftpClient.connect(ftpHost, ftpPort); // 登陆FTP服务器 ftpClient.login(ftpUserName, ftpPassword); ftpClient.type(FTP.BINARY_FILE_TYPE); if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { logger.error("未连接到FTP,用户名或密码错误。"); ftpClient.disconnect(); } else { logger.info("FTP连接成功。");

但每次到了
FTPReply.isPositiveCompletion(ftpClient.getReplyCode())
这一步时,总是连接失败。后来才观察到,我需要连接的是一个ftps服务器,
故以上代码需要更改为如下:

            FTPSClient ftpClient = new FTPSClient();
            // 连接FTP服务器
            ftpClient.connect(ftpHost, ftpPort);
            // 登陆FTP服务器
            ftpClient.login(ftpUserName, ftpPassword);
            ftpClient.type(FTP.BINARY_FILE_TYPE);
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                logger.error("未连接到FTP,用户名或密码错误。");
                ftpClient.disconnect();
            } else {
                logger.info("FTP连接成功。");

FTP/FTPS/SFTP区别

无法正确获取文件问题

解决了上述问题后,终于能够正常连接,但在获取文件的时候,每次都是获取的null,然后试探性的调用了一下ftpClient.listFiles()结果是个空数组
[外链图片转存失败(img-Jt1klP9M-1568796327259)(CF7EFB75235C45CBA7E8CA8E56EB4394)]
而且根本无法点开
首先查到说是ftp主动被动模式有关,然后我在连接上加了一句
ftpClient.enterLocalPassiveMode();
改成了被动模式,但是仍然不生效,后面在stackoverflow上看到了一个同样的问题,提示需要加上这一段

            ftpClient.execPBSZ(0);
            ftpClient.execPROT("P");
            ftpClient.type(FTP.BINARY_FILE_TYPE);

问题完美解决,原因暂时没去深究。希望有大佬来解答一下。
有遇到同样问题的小伙伴可以使用试试看

完整获取ftpsClient的方法

* 获取FTPClient对象 * @param ftpHost FTP主机服务器 * @param ftpPassword FTP 登录密码 * @param ftpUserName FTP登录用户名 * @param ftpPort FTP端口 默认为21 * @return public static FTPSClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) { try { FTPSClient ftpClient = new FTPSClient(); // 连接FTP服务器 ftpClient.connect(ftpHost, ftpPort); ftpClient.enterLocalPassiveMode(); // 登陆FTP服务器 ftpClient.login(ftpUserName, ftpPassword); ftpClient.execPBSZ(0); ftpClient.execPROT("P"); ftpClient.type(FTP.BINARY_FILE_TYPE); if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) { System.err.println("未连接到FTP,用户名或密码错误。"); ftpClient.disconnect(); } else { logger.info("FTP连接成功。"); return ftpClient; } catch (SocketException e) { System.out.println("FTP的IP地址可能错误,请正确配置。"); } catch (IOException e) { System.err.println("FTP的端口错误,请正确配置。"); return null; 前言最近需要去第三方拉取数据报告,某个邮件的第三方采用的是ftp存取csv文件,故项目中需要使用ftp,但遇到了一些坑,特此记录一下环境<dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <ve...
ftpClient.changeWorkingDirectory(path); ftpClient.enterLocalPassiveMode(); //由于apache不支持中文语言环境,通过定制类解析中文日期类型 ftpClient.configure(new FTPClientConfig("com.zznode.tnms.ra.c11n.nj.resource.ftp.UnixFTPEntryParser")); FTPFile[] files = ftpClient.listFiles();
写个功能要从ftp服务下载文件,在本地的ftp服务一切ok(window环境),但是在Linux环境发现不管切换到哪个目录,获取什么文件,调用FTPClient.listFiles()方法时返回的始终为,但是代码又运行正常没有异常抛出。然后断点ftp.getReplyCode()也返回230登陆成功. 在调用FTPClient.listFiles()方法前,先调用FTPClient.enterLocalPassiveMode();就可以了。 下面是完整的ftp util例子 package com.tes
解决了某些系统中,ftpClient.listFiles()返回值总是为问题。 使用方法如下: ftpClient.changeWorkingDirectory(path); ftpClient.enterLocalPassiveMode(); ftpClient.configure(new FTPClientConfig("cn.com.wechat.ftp.UnixFTPEntryParser")); //这里记得改成你放的位置 FTPFile[] fs = ftpClient.listFiles(); // 得到目录的相应文件列表
java使用FTPClient.listFiles(filePath)从ftp的指定目录拉取文件,FTPClient.listFiles()却能拉取到全部文件夹及文件,证明ftp连接没问题,可能是路径存在问题。后来通过查询资料,发现ftp存在根目录,通过以下方法打印根路径信息,拼接到目标路径前解决问题。 String rootPath = ftpClient.printWorkingDirectory(); logger.info("ftp根地址:{}",rootPath); // 获取FTP上所有文件
apache 开源库:commons-net 超时处理。 FTPClient 一共有 6 个设置超时的接口,而不管是文件上传或下载,这过程,FTP 都会创建两个 Socket,一个用于传输控制命令,一个用于传输文件数据,超时接口和这两个 Socket 之间的关系如下: setConnectTimeout() 用于设置终端 Socket 与 FTP 服务器建立连接这个过程的超时时间。 setDefaultTimeout() 用于设置终端的传输控制命令的 Socket 的 SoTimeout,即针对传输控
版本是.net3.5加密FTP文件操作,利用FTPS实现文件上传,下载,删除操作。 string ftpIP = "";//FTP ip string ftpUSER = "";//FTP 用户名 string ftpPWD = "";//FTP 密码 --下载文件方法体 FTPSClient client = new FTPSClient(); client.Connect(ftpIP, new NetworkCredential(ftpUSER, ftpPWD), ESSLSupportMode.CredentialsRequired | ESSLSupportMode.Implicit, new RemoteCertificateValidationCallback((a, b, c, d) => { return true; })); client.SetTransferMode(ETransferMode.Binary); client.SetTextEncoding(ETextEncoding.UTF8); IList filelist = client.GetDirectoryList("/ABC/"); for (int i = 0; i { return true; })); client.SetTransferMode(ETransferMode.Binary); client.SetTextEncoding(ETextEncoding.UTF8); DirectoryInfo di = new DirectoryInfo(sourcePath + "\\"); FileInfo[] files = di.GetFiles(); for (int i = 0; i < files.Length; i++) client.PutFile(sourcePath + "\\" + files[i].Name, "/ABC/" + files[i].Name); //删除原文件 File.Copy(sourcePath + "\\" + files[i].Name, sourcePath + "_Bak\\" + files[i].Name, true); File.Delete(sourcePath + "\\" + files[i].Name);
问题描述: 最近遇到一个奇怪的问题,代码程序连接ftp服务器下载文件时,通过FTPClient.listFiles()获取不到目录下的文件,一直返回null,(ftp客户端连接正常,命令行连接也正常) 百度一圈之后,最完美的解决方案(引用): https://blog.csdn.net/hu15903314850/article/details/79887604(感谢客主) 1 FTPFile[] fs = ftp.listFiles(remotePath); 这里代码获取fs的长度为0.很苦恼。 奇怪的是我在我本机的windows系统下搭建的ftp服务器正常。但在linux下面却不行。 只需要在加入下一行代码即可。...
最近在JAVA项目中用到ftpClient.listFiles()函数时,总是返回null。现在就我遇到的情况讲讲解决方案。 环境:Linux, 语言 $LANG=en_US.UTF-8 相关jar:common-net-3.3.jar(common-net-3.4.jar和common-net-1.4.1.jar依旧有这个问题
项目需要做文件的上传下载,由后台定时生成word,pdf文件上传到ftp服务器,然后供客户端下载。聊聊其中遇到的坑 在文件上传的时候,遇到坑之一,编码问题,因为ftp编码是iso-8859-1,所以在上传的时候必须进行转码,不然会报错, 遇到的第二个问题:在上传文件的时候,如果服务器需要创建目录;当时创建多层文件夹的方式在windows下创建成功,丢在服务器上后就报错。
### 回答1: ftpclient.listfiles可能是因为FTP服务器上没有文件或目录,或者连接FTP服务器失败。您可以检查FTP服务器上是否有文件或目录,以及确保您的FTP客户端已经成功连接到FTP服务器。如果问题仍然存在,您可以尝试重新启动FTP客户端或FTP服务器,并检查FTP客户端的配置是否正确。 ### 回答2: FTPClient是Java程序中一个常用的FTP客户端库,它提供了一系列的接口函数,可以实现FTP协议的各种操作,如上传、下载、删除、重命名、获取远程目录信息等。使用FTPClient获取远程目录信息时,可以通过调用listFiles()函数来获取目录列表,但是有时候我们会遇到listFiles()函数返回为的情况,这可能是由以下几点原因引起的。 1. 连接失败 在使用FTPClient进行操作时,首先需要连接FTP服务器。如果连接失败,listFiles()函数会返回一个的数组。连接失败的原因可能是FTP服务器地址、端口、用户名、密码等配置信息错误,或者服务器处于闲置状态等等。 2. 登录失败 如果连接成功,但登录失败,listFiles()函数也会返回数组。登录失败的原因可能是用户名、密码错误,或者没有权限访问FTP服务器中的目录。 3. 路径错误 当FTP服务器端的路径设置有误时,listFiles()函数也会返回数组。这时候需要检查程序中访问的远程目录路径是否与实际情况相符合。 4. 服务器返回的信息格式不正确 在进行FTP操作时,客户端和服务器之间会进行数据交换。如果服务器返回的信息格式不正确,解析数据时会出现错误,导致listFiles()函数返回数组。 5. 连接未关闭 如果FTPClient连接还未关闭,而我们在不同的线程中进行连接时,可能会导致listFiles()函数返回数组,因为多个线程可能会互相干扰。 综上所述,当listFiles()函数返回为时,我们应该仔细检查代码中的FTP连接、登录、路径设置、服务器返回信息等情况,以确定具体的问题原因,并做出相应的处理。 ### 回答3: FTPClient是Java中用于连接FTP服务器的工具类,可以实现文件的上传、下载、重命名等操作。在使用FTPClient时,有时我们会遇到ftpclient.listfiles的情况。 造成ftpclient.listfiles可能的原因如下: 一、连接的FTP服务器路径有误,可能是路径拼写错误或FTP服务器 IP 出错,这样连接会失败,进而会导致 listfiles() 方法返回为解决方法:检查连接的 FTP 服务器 IP,以及客户端访问该服务器的路径和路径名是否正确。 二、FTP服务器本身问题,如果连接的FTP服务器出现异常情况,如停机维护等,那么就会导致ftpclient.listfiles解决方法:等待 FTP 服务器重启完毕后再试。 三、FTP客户端主机的防火墙或安全软件把客户端IP地址拦截了,导致FTP控制连接失败。 解决方法:关闭防火墙或安全软件的拦截,或者手动添加FTP客户端IP地址的白名单。 四、FTP服务端配置问题,如权限不足。 解决方法:检查FTP服务端配置,获取更高的权限。 以上是可能导致FTPClient.listfiles的原因,根据具体情况进行调查和排查。如果以上解决方法不能解决问题,可以查看 FTP 服务器日志,获取更详细的错误日志信息,找到原因再解决