Я использую Apache Commons FTPClient 3.1 для простой загрузки файлов. Файл storefile() отлично работает для файлов меньших размеров (до 100 МБ), но когда я пытаюсь загрузить что-то большее, чем 100 МБ, он завершит загрузку, но просто повесит.
Я попытался войти в пассивный режим, как это предполагали другие, но, похоже, проблема не устранена. Я пробовал несколько FTP-серверов с одинаковыми результатами, поэтому я предполагаю, что это не хост.
Вот суть того, что я делаю:
ftpClient.connect(...);
ftpClient.login(...);
ftpClient.enterLocalPassiveMode();
boolean success = ftpClient.storeFile(...);
if(success)
...
Программа зависает в строке 4 для больших файлов, но успешно загружает файл.
https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html
Время ожидания. Эта ссылка может помочь.
Функция поддержания канала управления: Во время передачи файлов соединение для передачи данных занято, но управляющее соединение не работает. FTP-серверы знают, что управляющее соединение используется, поэтому не будет закрывать его из-за отсутствия активности, но сетевым маршрутизаторам гораздо труднее узнать, что соединения управления и данных связаны друг с другом. Некоторые маршрутизаторы могут обрабатывать соединение управления как незанятое и отключать его, если передача по соединению данных занимает больше времени, чем допустимое время простоя для маршрутизатора. Одним из решений этого является отправка безопасной команды (то есть NOOP) по управляющему соединению с reset таймером простоя маршрутизатора. Это активируется следующим образом:
ftpClient.setControlKeepAliveTimeout(300); // set timeout to 5 minutes
Это приведет к тому, что методы загрузки/загрузки файлов будут отправлять NOOP примерно каждые 5 минут.