Apache FTPClient - recupero dei file incompleti su Linux, funziona su Windows
-
29-09-2019 - |
Domanda
Ho un'applicazione java su Websphere che utilizza Apache Commons FTPClient per recuperare i file da un server Windows tramite FTP. Quando ho distribuire l'applicazione di Websphere in esecuzione in un ambiente Windows, sono in grado di recuperare tutti i file in modo pulito. Tuttavia, quando schiero la stessa applicazione per Webpshere su Linux, ci sono casi in cui sto ottenendo un file incompleti o corrotti. Questi casi sono coerenti, però, in modo tale che gli stessi file fallirà ogni tempo e restituire lo stesso numero di byte (di solito solo pochi byte meno di quello che dovrei ottenere). Direi che posso leggere circa il 95% dei file con successo su Linux.
Ecco il codice in questione ...
ftpc = new FTPClient();
// set the timeout to 30 seconds
ftpc.enterLocalPassiveMode();
ftpc.setDefaultTimeout(30000);
ftpc.setDataTimeout(30000);
try
{
String ftpServer = CoreApplication.getProperty("ftp.server");
String ftpUserID = CoreApplication.getProperty("ftp.userid");
String ftpPassword = CoreApplication.getProperty("ftp.password");
log.debug("attempting to connect to ftp server = "+ftpServer);
log.debug("credentials = "+ftpUserID+"/"+ftpPassword);
ftpc.connect(ftpServer);
boolean login = ftpc.login(ftpUserID, ftpPassword);
if (login)
{
log.debug("Login success..."); }
else
{
log.error("Login failed - connecting to FTP server = "+ftpServer+", with credentials "+ftpUserID+"/"+ftpPassword);
throw new Exception("Login failed - connecting to FTP server = "+ftpServer+", with credentials "+ftpUserID+"/"+ftpPassword);
}
is = ftpc.retrieveFileStream(fileName);
ByteArrayOutputStream out = null;
try {
out = new ByteArrayOutputStream();
IOUtils.copy(is, out);
} finally {
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(out);
}
byte[] bytes = out.toByteArray();
log.info("got bytes from input stream - byte[] size is "+ bytes.length);
Qualsiasi aiuto con questo sarebbe molto apprezzato.
Grazie.
Soluzione
Ho il sospetto che il FTP potrebbe essere utilizzando ASCII piuttosto che modalità di trasferimento binario, e la mappatura quello che pensa siano finestra sequenze di fine linea nei file di Unix end-of-linee. Per i file che sono in realtà il testo, questo funzionerà. Per i file che sono veramente binario, il risultato sarà la corruzione e un file leggermente più corto se il file contiene alcune sequenze di byte.
FOLLOWUP
... e allora perché questo dovrebbe funzionare su Windows e non Linux rimane un mistero per un altro giorno.
Il mistero è facile da spiegare. Stavi FTP'ing file da un computer Windows a un computer Windows, quindi non c'era bisogno di cambiare i marcatori di fine linea.