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 服务器日志,获取更详细的错误日志信息,找到原因再解决。