Я только что реализовал своего рода следующий код.
Я обнаружил, что , если вы используете сжатые потоки , вы не можете полагаться на переданные байты, о которых сообщает прослушиватель, потому что сервер может ожидать дальнейших данных для декодирования предыдущих полученных блоков.
Однако, даже если потоки являются простыми, в некоторых случаях потерянное соединение вы все равно не можете рассчитывать на общее количество переданных байтов, как сообщает слушатель. Итак, я наконец понял, что лучше всего спросить у сервера, сколько байтов он получил.
В моем шаблоне временная избыточность носит более общий характер и включает управляющее соединение с FTP-сервером. Вы можете ограничить цикл while соединением для передачи данных, т.е. загрузкой.
</p>
<pre><code>FTPClient ftpClient = null;
long writtenBytes;
boolean isCompletedStartingDelete = false; // Our policy is overwrite at first
for (int attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
try {
ftpClient = getFTPClient();
configureFtpClient(ftpClient);
doLogin(ftpClient);
ftpClient.changeDirectory(remoteDirectory);
if (!isCompletedStartingDelete) { // Our policy is overwrite at first
try {
ftpClient.deleteFile(file);
isCompletedStartingDelete = true;
} catch (FTPException e) {
// Maybe you should check if this exception is really thrown for file not existing.
isCompletedStartingDelete = true;
}
}
try {
writtenBytes = ftpClient.fileSize(fileName);
} catch (Exception e) {
writtenBytes = 0;
}
if (ftpClient.isResumeSupported()) {
// With this template you also could use APPEND
ftpClient.upload(file, writtenBytes, listener);
} else {
ftpClient.upload(file, listener);
}
} catch (FTPAbortException e) {
// User Aborted operation
break;
} catch (Exception e) {
if (attempt == MAX_ATTEMPTS) { // Or in general lastLoop
throw e;
} else {
// Mask failure
// LOG
}
} finally {
if (ftpClient != null && ftpClient.isConnected()) {
try { ftpClient.disconnect(); } catch (Throwable t) { /* LOG */ }
}
}