我正在使用Apache Commons FTPClient 3.1来进行简单的文件上传。 storefile()适用于较小尺寸(小于100MB)的文件,但是当我尝试上传大于100MB的内容时,它会完成上传但只是挂起。
我尝试过像其他人建议的那样进入被动模式,但它似乎无法解决问题。我尝试过多个具有相同结果的FTP服务器,所以我猜它不是主机。
以下是我正在做的事情的要点:
ftpClient.connect(...);
ftpClient.login(...);
ftpClient.enterLocalPassiveMode();
boolean success = ftpClient.storeFile(...);
if(success)
...
对于大文件,程序在第4行挂起,但是成功上传了该文件。
答案 0 :(得分:6)
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。