Commons.net.ftp - Monitorar o Download/Upload

Fala pessoal,

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 :smiley:

[]'s

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.

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.


private FTPClient ftp = new FTPClient();
private FileChannel in;

//verifica se o arquivo a ser transferido já existe no servidor
public boolean appendArquivo(File arquivo) throws IOException
{
        //o arquivo já existe?
	boolean existe = false;

        //qnts bytes foram transferidos?
	long bytesTransferidos = 0;

        //iniciando o FileChannel para poder posicionar channel no byte certo, caso o arquivo exista
	in = new RandomAccessFile(arquivo, "r").getChannel();
	
        //pegando informações dos arquivos do diretório atual do ftp
	FTPFile[] ftpFiles = ftp.initiateListParsing().getFiles();	    			
         
	for(int i=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 apropriado
	if(existe)
		in.position(bytesTransferidos);
		
	return existe;
}
			
//transfere o arquivo
public void transferir(final File arquivo, final boolean append)
{		
	new Thread()
	{
		public void run()
		{
			final WritableByteChannel out;	
				
			try
			{
                                //setando o tipo de arquivo a ser transferido
				ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
					
                                //se o arquivo existe, usamos o método appendFileStream,
                                //caso contrário, usamos o storeFileStream
				if(append)
					out = Channels.newChannel(ftp.appendFileStream(arquivo.getName()));
				else
					out = Channels.newChannel(ftp.storeFileStream(arquivo.getName()));
					
				
				ByteBuffer bb = 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(IOException e)
			{
				e.printStackTrace();
			}				
		}
	}.start();		
}

Se esse código foi útil pra alguém, let me know :smiley:

[puxa-saco]
E obrigado novamente thingol, como sempre enquanto estou indo com a farinha vc já tá voltando com o bolo :smiley:
[/puxa-saco]

[]'s

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?