Problema com FTP + Swing

4 respostas
P

Pessoal,

eu estava com dificuldade em fazer o upload de um arquivo para o servidor via FTP a partir da minha aplicação feita com Swing. Dei uma pesquisada no Google e no próprio GUJ e consegui resolver o problema, estou conseguindo jogar o sarquivos no local correto no servidor.

O problema é que, para enviar duas fotos (ou um pouco mais, mas nunca muitas), o meu JFrame fica travado, e o pior é que está demorando bastante para completar o upload.

Vou postar o código… se alguém puder me dar uma dica eu agradeço muito.

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;



public class FotosFTP {
		
	public static boolean insereFotos(Moto moto){
		
		FTPClient ftp = new FTPClient();
		
		try {
			
			ftp.connect("ftp.servidor.com.br");
			
			if( FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) {
				ftp.login( "username", "senha" );
			} else {
				//erro ao se conectar
				ftp.disconnect();
				System.out.println("Conexão recusada");
				return false;
			}
			
			ftp.changeWorkingDirectory("/public_html/fotos");
			ftp.enterLocalActiveMode(); 
			ftp.enterLocalPassiveMode();
			
			FileInputStream stream = null;
			String nomeArquivo = null;
			
			
									
			for (int i = 0; i &lt moto.getFotos().size(); i++){
				nomeArquivo = "moto"+moto.getId()+"_"+i+ moto.getFotos().get(i).getPath().substring(moto.getFotos().get(i).getPath().lastIndexOf("."));

				stream = new FileInputStream(moto.getFotos().get(i));
				
				ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
				
				ftp.storeFile( nomeArquivo, stream );
			}
			stream.close();
			stream = null;
			
		} catch (Exception e) {
			// TODO: handle exception
			return false;
		} finally {
			try {
				ftp.disconnect();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			ftp = null;
		}
		
		return true;
		
	}
	

}

Trata-se de um upload de imagens para o servidor.

Tem algum erro no código que esteja causando essa lentidão toda?

obs: Moto é uma classe onde existe um arraylist de files (as imagens).

Estou usando a apache commons net

Agradeço qualquer ajuda.

4 Respostas

davidbuzatto

Isso se deve ao fato do swing não ser thread safe, ou seja, vc precisa executar seu método que envia os dados para o servidor em uma thread separada, e utilizando outra thread vc atualiza o JFrame da sua aplicação.

De uma olhada nas classes e/ou métodos:
SwingWorker
SwingUtilities.invokeLater( Runnable )

A classe SwingWorker (faz parte do Java SE 6) é uma abstração para facilitar a utilização de threads para esse fim no swing.

O invokeLater é um método que coloca uma thread para ser executada de forma paralela a thread de eventos do awt, fazendo com que sua aplicação não trave.

Até mais!

P

Mas é normal essa demora para enviar os arquivo pro FTP?

davidbuzatto

Depende do tamanho do arquivo, da sua velocidade de conexão, do tráfego da rede, etc. É algo que não dá p/ ter uma certeza absoluta da velocidade.

P

Valeu pela dica. Estou tentando, apanhando mas tentando ainda, fazer o ftp em uma thread separada.

Obrigado

Criado 5 de agosto de 2007
Ultima resposta 6 de ago. de 2007
Respostas 4
Participantes 2