3

我正在使用 Apache Commons FTPClient 3.1 进行简单的文件上传。storefile() 适用于较小的文件(小于 100MB),但是当我尝试上传大于 100MB 的文件时,它会完成上传但只是挂起。

我试过像其他人建议的那样进入被动模式,但似乎并没有解决问题。我已经尝试了多个具有相同结果的 FTP 服务器,所以我猜它不是主机。

这是我正在做的事情的要点:

ftpClient.connect(...);
ftpClient.login(...);
ftpClient.enterLocalPassiveMode();
boolean success = ftpClient.storeFile(...);
if(success)
...

对于大文件,该程序在第 4 行挂起,但确实成功上传了文件。

4

1 回答 1

7

https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html

它的超时。此链接可能会有所帮助。

控制通道保活特性:在文件传输过程中,数据连接忙,而控制连接空闲。FTP 服务器知道控制连接正在使用,因此不会因为缺乏活动而关闭它,但是网络路由器要知道控制连接和数据连接是相互关联的要困难得多。一些路由器可能会将控制连接视为空闲,如果数据连接上的传输时间超过路由器允许的空闲时间,则将其断开。对此的一种解决方案是通过控制连接发送安全命令(即 NOOP)以重置路由器的空闲计时器。启用如下:

 ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes

这将导致文件上传/下载方法大约每 5 分钟发送一次 NOOP。

于 2012-05-10T08:41:09.813 回答