Estou iniciando uma implementação usando a bliblioteca commons da apache para que minha aplicação envie e receba arquivos de um server FTP.
Estou utilizando os métodos storeFile e appendFile da classe FTPClient para enviar/resumir os arquivos, e, adaptando uns exemplos que peguei na net, funcionou tudo tranquilo… O problema eh que preciso monitorar como está a transferência, e mostrar ao usuário uma ProgressBar de quanto falta para a tarefa ser concluída.
Alguém já teve que fazer algo parecido com isso? deve existir algum jeito simples de pegar pelo menos o número de bytes transferidos, mas não encontrei um jeito que não seja POG!!! Qqr ajuda será bem vinda
Em vez de usar storeFile, use storeFileStream. É claro que dessa forma você tem de controlar o que ocorre, mas esse é o preço que você paga por ter mais controle.
J
javazilla
Vlw thingol!
Consegui pegar os bytes transferidos usando esse método!
Pra quem precisa de algo parecido, ai vai o código dos métodos de teste que fiz.
privateFTPClientftp=newFTPClient();privateFileChannelin;//verifica se o arquivo a ser transferido já existe no servidorpublicbooleanappendArquivo(Filearquivo)throwsIOException{//o arquivo já existe?booleanexiste=false;//qnts bytes foram transferidos?longbytesTransferidos=0;//iniciando o FileChannel para poder posicionar channel no byte certo, caso o arquivo existain=newRandomAccessFile(arquivo,"r").getChannel();//pegando informações dos arquivos do diretório atual do ftpFTPFile[]ftpFiles=ftp.initiateListParsing().getFiles();for(inti=0;i<ftpFiles.length;i++){if(ftpFiles[i].getName().equalsIgnoreCase(arquivo.getName())){existe=true;bytesTransferidos=ftpFiles[i].getSize();}}//caso o arquivo já exista, posicione o FileChannel no byte apropriadoif(existe)in.position(bytesTransferidos);returnexiste;}//transfere o arquivopublicvoidtransferir(finalFilearquivo,finalbooleanappend){newThread(){publicvoidrun(){finalWritableByteChannelout;try{//setando o tipo de arquivo a ser transferidoftp.setFileType(FTPClient.BINARY_FILE_TYPE);//se o arquivo existe, usamos o método appendFileStream,//caso contrário, usamos o storeFileStreamif(append)out=Channels.newChannel(ftp.appendFileStream(arquivo.getName()));elseout=Channels.newChannel(ftp.storeFileStream(arquivo.getName()));ByteBufferbb=ByteBuffer.allocateDirect(16384);bb.clear();while(in.read(bb)!=-1){bb.flip();out.write(bb);bb.clear();//aqui só estou imprimindo em que byte que a transferência está.//tendo o numero de bytes do arquivo e os bytes transferidos fica fácil//de fazer o progressbar.System.out.println(in.position());}in.close();out.close();}catch(IOExceptione){e.printStackTrace();}}}.start();}
Se esse código foi útil pra alguém, let me know
[puxa-saco]
E obrigado novamente thingol, como sempre enquanto estou indo com a farinha vc já tá voltando com o bolo
[/puxa-saco]
[]'s
netally
Javazilla:
Sei que faz tempo que você postou este código, mas quem sabe você ainda se lembra.
Sabe me dizer que número mágico é esse (16384) que aparece na linha 57 do teu código?