Я использую ftp4j для отправки данных на сервер через FTP (точнее, FTPS). Я могу подключиться и аутентифицировать пользователя, но когда я пытаюсь загрузить файл, возникает сообщение IOException
, содержащее следующее сообщение: «FTP-соединение закрыто», даже если соединение все еще активно.
Я перепробовал несколько незащищенных FTP-сайтов, и все отлично работает, включая загрузку. Я не смог найти ни одного сайта FTPS, с помощью которого я мог бы проверить загрузку, поэтому единственная ссылка, которую я имею, - это сервер FTPS, с которого я работаю (FTP через явный TSL / SSL). Итак, если у кого-то из вас есть сайт c FTPS, где я могу загружать файлы, дайте мне знать!
Я также попытался поиграть с кодировкой. И UTF-8
, и ASCII
вообще ничего не изменили.
Да, я настраиваю защиту / шифрование на основе FTP-сайта, на который я хочу загрузить.
РЕДАКТИРОВАТЬ: Если Я удаляю ftpClient.upload(task.getFile());
, все работает нормально.
Если у вас есть какие-либо вопросы, пожалуйста, не стесняйтесь. Спасибо за вашу доброту!
Вот мой код:
if (this.app == null) {
return;
}
if (this.tasks == null) {
return;
}
synchronized (ftpClient) {
try {
if (!ftpClient.isConnected()) {
ftpClient.connect(ftpHandler.getHost(), ftpHandler.getPort());
}
if (!ftpClient.isAuthenticated()) {
ftpClient.login(ftpHandler.getUser(), ftpHandler.getPassword());
}
for (FTPTransferTask task : tasks) {
if (task.getFile() == null) {
continue;
}
if (!task.getFile().exists()) {
continue;
}
try {
if (ftpClient.currentDirectory() != ftpHandler.getPath()) {
ftpClient.changeDirectory(ftpHandler.getPath());
}
Log.w("myApp", "FTPTransferThread.java - run - Sending file " + task.getFile().getName() + " to " + ftpClient.getHost());
ftpClient.upload(task.getFile()); // This is where the exception is raised
Log.w("myApp", "FTPTransferThread.java - run - File " + task.getFile().getName() + " sent to " + ftpClient.getHost());
} catch (Exception e) {
// Here, the connection is still open (and the user is still authenticated)
// At least, based on the FTPClient class's properties
Log.w("myApp", "FTPTransferThread.java - run - Failed to send file " + task.getFile().getName() + " to " + ftpClient.getHost());
e.printStackTrace();
}
}
if (ftpClient.isConnected()) {
ftpClient.disconnect(true); // The exception is raised here too
}
} catch (Exception e) {
Log.w("myApp", "FTPTransferThread.java - run - Failed to communicate with the client.");
e.printStackTrace();
try {
if (ftpClient.isConnected()) {
ftpClient.disconnect(false); // Using false, so I'm not notifying the server, so no problem
}
} catch (Exception ex) {
e.printStackTrace();
}
}
}
Вот трассировка стека:
W/System.err: java.io.IOException: FTPConnection closed
at it.sauronsoftware.ftp4j.FTPCommunicationChannel.read(FTPCommunicationChannel.java:144)
at it.sauronsoftware.ftp4j.FTPCommunicationChannel.readFTPReply(FTPCommunicationChannel.java:187)
W/System.err: at it.sauronsoftware.ftp4j.FTPClient.currentDirectory(FTPClient.java:1590)
at eu.basicairdata.graziano.gpslogger.ftp.FTPTransferThread.run(FTPTransferThread.java:58)
W/myApp: FTPTransferThread.java - run - Failed to communicate with the client.
W/System.err: java.io.IOException: FTPConnection closed
at it.sauronsoftware.ftp4j.FTPCommunicationChannel.read(FTPCommunicationChannel.java:144)
W/System.err: at it.sauronsoftware.ftp4j.FTPCommunicationChannel.readFTPReply(FTPCommunicationChannel.java:187)
at it.sauronsoftware.ftp4j.FTPClient.disconnect(FTPClient.java:1133)
at eu.basicairdata.graziano.gpslogger.ftp.FTPHandler.ClientDisconnect(FTPHandler.java:149)
at eu.basicairdata.graziano.gpslogger.ftp.FTPTransferThread.run(FTPTransferThread.java:77)