ftp.storeFile报null

本文解决了一个关于使用FTP进行文件上传时出现的问题,原因是错误地设置了传输模式为被动模式。通过去掉这一设置,成功实现了文件上传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自“http://blog.youkuaiyun.com/afei3418/article/details/54375858”


 this.ftpClient.storeFile(fileName, inStream) 方法执行时无反应,最后提示错误

    

    原因:代码中加了多了一个设置   this.ftpClient.enterLocalPassiveMode();   //将传输模式设置成被动,这种情况如果服务器没有做特殊设置的话是正常的,现在去掉这个设置,就可以正常上传文件了。

   具体采用什么样的传输方式,跟服务器设置有关。把从网上搜到的FTP上传主动和被动模式介绍放在下边:

一个完整的FTP文件传输需要建立两种类型的连接,一种为文件传输下命令,称为控制连接,另一种实现真正的文件传输,称为数据连接。

1) 控制连接

客户端希望与FTP服务器建立上传下载的数据传输时,它首先向服务器的TCP 21端口发起一个建立连接的请求,FTP服务器接受来自客户端的请求,完成连接的建立过程,这样的连接就称为FTP控制连接。

2) 数据连接

FTP控制连接建立之后,即可开始传输文件,传输文件的连接称为FTP数据连接。FTP数据连接就是FTP传输数据的过程,它有两种传输模式
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。

<think>好的,我现在需要解决用户在使用Java FTPUtil上传文件到FTP服务器后无法读取的问题。根据用户提供的引用内容,可能存在几个原因,我需要逐一分析。 首先,用户提到上传后的文件大小为0字节,这可能是因为InputStream没有被正确关闭或者没有完全写入。根据引用[1],使用storeFile方法时,需要确保输入流正确传输并关闭。例如,使用storeFileStream获取输出流后,必须手动关闭输出流,否则文件可能不完整。 其次,FTP连接模式的问题。引用[2]指出,被动模式设置可能导致连接问题。如果客户端在防火墙后,可能需要切换为主动模式。但有时候被动模式更可靠,需要根据服务器配置调整。用户可能需要检查FTPClient是否设置了正确的模式,如ftpClient.enterLocalPassiveMode()或主动模式。 另外,文件传输类型也是一个常见问题。如果没有设置二进制模式,可能导致文本文件被转换,损坏文件。根据引用[3],应该在传输前设置文件类型为FTP.BINARY_FILE_TYPE,避免自动转换。 还需要检查FTP配置是否正确,如主机名、端口、用户名和密码。如果配置错误,文件可能上传失败或权限不足。此外,上传后的文件权限问题也可能导致无法读取,需要确认服务器上的文件权限设置。 可能的解决方案包括:确保正确关闭流,设置传输模式为被动或主动,检查传输类型,验证配置信息,以及处理文件权限。需要逐步测试这些可能性,找出具体原因。</think>### Java FTP文件上传后无法读取的解决方案 #### 一、常见原因分析 1. **输入流未正确关闭** - 使用`storeFileStream`后未手动关闭输出流,导致文件写入不完整 - 示例代码问题: ```java OutputStream os = ftpClient.storeFileStream(remote); // 写入操作后缺少os.close() ``` 2. **传输模式配置错误** - 未正确设置主动/被动模式导致连接中断 - 引用示例:`ftpClient.enterLocalPassiveMode()`[^2] 3. **文件类型设置不当** - 未指定二进制传输模式导致文件损坏 - 关键设置: ```java ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 必须设置[^3] ``` 4. **文件权限问题** - 上传后未设置文件可读权限 - 需调用: ```java ftpClient.sendSiteCommand("chmod 644 " + remotePath); ``` #### 二、完整解决方案 ```java public boolean uploadFile(String remotePath, InputStream inputStream) { try { // 1.设置传输模式 ftpClient.enterLocalPassiveMode(); // 被动模式[^2] // 2.设置文件类型 ftpClient.setFileType(FTP.BINARY_FILE_TYPE); // 二进制传输 // 3.创建目录结构 if (!ftpClient.changeWorkingDirectory(remotePath)) { // 递归创建目录... } // 4.执行上传(推荐storeFile方法) boolean result = ftpClient.storeFile(remotePath, inputStream); // 5.显式关闭流 if (inputStream != null) { inputStream.close(); } // 6.设置文件权限 ftpClient.sendSiteCommand("chmod 644 " + remotePath); return result; } catch (IOException e) { logger.error("上传失败", e); return false; } } ``` #### 三、关键验证步骤 1. **检查文件完整性** ```java // 上传后立即验证文件大小 FTPFile[] files = ftpClient.listFiles(remotePath); if (files[0].getSize() == 0) { ... } ``` 2. **网络连接验证** ```java // 检查是否保持连接 if (!ftpClient.isConnected()) { ftpClient.reconnect(); } ``` 3. **配置参数检查** - 确认以下配置正确: ```properties ftp.host=192.168.1.100 ftp.port=21 ftp.username=user ftp.password=pass ftp.bufferSize=1024 ``` #### 四、高级调试建议 1. **启用调试日志** ```java ftpClient.addProtocolCommandListener( new PrintCommandListener(new PrintWriter(System.out), true)); ``` 2. **使用Wireshark抓包分析** - 观察数据包是否完整传输 - 检查TCP连接是否异常断开
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值