Olá pessoal,
estou com um problema um pouco grave.
Acontece que estou tentando fazer o FTP de um arquivo binario e o mesmo chega corrompido na outra maquina, porém o FTP responde sucesso.
Alguns pontos interessantes:
O arquivo binario geralmente fica corrompido entre os tamanhos de 30 a 40 mb.
Quando eu coloco um sleep (de 1 minuto) no meio do codigo a transferencia do FTP é feita corretamente.
O problema só acontece no cliente, em nosso ambiente não conseguimos reproduzir de jeito nenhum.
Anteriormente usavamos o metodo storeFile ao inves de storeFileStream e ocorria o mesmo problema.
O codigo esta sequencial, ou seja, já verificamos que não tem chance de estar fazendo o FTP do arquivo antes que ele tenha terminado de ser gerado.
private boolean uploadFile(DadosFtp dadosFtp) {
String fromLocalFile = dadosFtp.getLocalFile();
String toRemoteNameFile = dadosFtp.getRemoteFile();
File file = new File(fromLocalFile);
try {
if (dadosFtp.getRemoteDir() != null && !dadosFtp.getRemoteDir().equals("")) {
ftp.changeWorkingDirectory(dadosFtp.getRemoteDir());
}
logger.info("[INTVSI][FTP][upload] Inicio metodo uploadFile com o ipEr: " + dadosFtp.getIp()
+ " fromLocalFile: " + fromLocalFile + " toRemoteNameFile:" + toRemoteNameFile);
FileInputStream fis = new FileInputStream(file);
logger.info("[INTVSI][FTP][upload] metodo uploadFile. enviando arquivo. ipEr: " + dadosFtp.getIp()
+ " fromLocalFile: " + fromLocalFile + " toRemoteNameFile:" + toRemoteNameFile + ", "
+ fis.available() + ", " + file.length());
ftp.enterLocalPassiveMode();
ftp.deleteFile(toRemoteNameFile);
// Envia o arquivo.
if (dadosFtp.getBinary()) {
ftp.setFileType(FTP.BINARY_FILE_TYPE);
}
logger.info("[INTVSI] Aguardando 30s antes do output para mandar o arquivo com tamanho: " + file.length());
// Thread.sleep(30000);
OutputStream output = ftp.storeFileStream(toRemoteNameFile);
logger.info("[INTVSI] Aguardando mais 30s antes de obter codigo do FTP para o arquivo com tamanho: "
+ file.length());
// Thread.sleep(30000);
int reply = ftp.getReplyCode();
if (!FTPReply.isPositivePreliminary(reply)) {
logger.error("[ftp-envio] metodo uploadFile. Erro enviando arquivo com metodo storeFile. ipEr: "
+ dadosFtp.getIp() + " fromLocalFile: " + fromLocalFile + " toRemoteNameFile:"
+ toRemoteNameFile + " Tamanho do arquivo: " + file.length());
output.close();
fis.close();
return false;
}
Long tamanho = null;
try {
logger.info("Thread currentThread = " + Thread.currentThread());
tamanho = Util.copyStream(fis, output);
logger.info("[ftp-envio] Tamanho enviado: " + tamanho);
} catch (CopyStreamException e) {
logger.error("[ftp-envio] ocorreu problema na transferencia do arquivo. Tamanho enviado: " + tamanho);
}
fis.close();
output.close();
if (!ftp.completePendingCommand()) {
logger.error("[ftp-envio] impossivel completar comando pendente.");
}
} catch (IOException e) {
logger.error("[INTVSI][FTP][upload] metodo uploadFile. Exception enviando arquivo. ipEr: "
+ dadosFtp.getIp() + " fromLocalFile: " + fromLocalFile + " toRemoteNameFile:" + toRemoteNameFile
+ "Exeption: " + AplicacaoUtils.getStackTrace(e));
return false;
}
logger.info("[INTVSI][FTP][upload] Fim metodo uploadFile com o ipEr: " + dadosFtp.getIp() + " fromLocalFile: "
+ fromLocalFile + " toRemoteNameFile:" + toRemoteNameFile + ". Tamanho local: " + file.length());
return true;
}
Qualquer sugestão é bem vinda...obrigada!!