[Resolvido] Envio de Arquivo TXT para FTP indo Vazio

Olá Galera,
estou tentando usar esse tutorial bem simples: http://douglasalipio.wordpress.com/2010/09/07/ddouglas-mesquitaworkspaceandroidsendftpreslayoutmain-xml/#comment-40

Ele pega um arquivo e envia por FTP mas os arquivos enviados com conteúdo, são salvos no FTP sem nenhum conteúdo

O que faço pra concertar isso, estou usando: commons-net-2.0
Ja tentei soluções desses foruns, mas não deram certo:
http://www.guj.com.br/java/262539-resolvido-arquivo-xml-baixado-via-ftp-vindo-vazio---android
http://www.guj.com.br/java/49682-ftp---problemas-ao-enviar-o-arquivo

Meu Code:

import org.apache.commons.net.ftp.FTPClient;
public class EnviarArquivoFTP extends Activity implements OnClickListener,Runnable {
	private ProgressDialog dialog;
	private Handler handler = new Handler();


	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.enviararquivoftp);
		enviar();
		Button b = (Button) findViewById(R.enviarArquivo.btnenviarFTP);
		b.setOnClickListener(this);
		
	}

	public void enviar(){
		dialog = ProgressDialog.show(this, "Social Alimenta FTP",
				 "Enviando arquivo, por favor aguarde...", false, true);
				
				// Faz o envio do arquivo FTP.
				new Thread(this).start();
	}
	public void onClick(View v) {
        /** InitComponents */
        Intent ittEVoltar = new Intent(getApplicationContext(), SocialAlimenta2Activity.class);
        startActivity(ittEVoltar); 
	}
	
	public void run() {
			
		String login = "******";
		String senha = "******";
		String diretorio = "/data/data/br.gov.sjc.socialalimenta/files/";
		String nomeArquivo = "socialAlimenta.txt";
		
		final TextView notificacao = (TextView) findViewById(R.enviarArquivo.lblnotificacao);
		
		try {
                        envioFTP(login, senha, diretorio, nomeArquivo);			
			handler.post(new Runnable() {
				public void run() {
					notificacao.setText("Arquivo enviado com sucesso");
					notificacao.setVisibility(View.VISIBLE);
				}
			});
			
		} catch (IOException e) {

			e.printStackTrace();
			
		}finally {
			dialog.dismiss();
		}
	}

	/**
	 * Faz o envio do arquivo via FTP.
	 *
	 * @param login
	 * @param senha
	 * @param diretorio
	 * @param nomeArquivo
	 * @throws IOException 
	 */
	private void envioFTP(String login, String senha, String diretorio, String nomeArquivo) throws IOException {
		FTPClient ftp = new FTPClient();
		boolean erroEnvio = true;
		int tentativas = 1;
		do {

			try {
				ftp.connect( "000.000.000.000", 21 );
				ftp.login(login, senha);
				//FileInputStream arqEnviar = new FileInputStream(diretorio);
				InputStream arqEnviar = new FileInputStream(diretorio);
				ftp.setFileTransferMode(FTPClient.ASCII_FILE_TYPE);
				ftp.setFileType(FTPClient.ASCII_FILE_TYPE);
				ftp.storeFile(nomeArquivo, arqEnviar);
				ftp.logout();
				ftp.disconnect();
			} catch (SocketException e) {
				e.printStackTrace();
			} catch (IOException ioE) {
				ioE.printStackTrace();
				erroEnvio = false;
				tentativas++;
				erroEnvio = true;
			} catch (Exception e) {
				e.printStackTrace();
			}finally{
				ftp.logout();
				ftp.disconnect();
			}
	}
	 while (erroEnvio);
	
	}

Cara, vc está conectando o seu ftp utilizando o número do ip ou o nome?

Se for o nome altere para o número.

No meu caso funcionou.

de qualquer forma segue um exemplo que fiz.

Altere para sua necessidade.

Att.



public boolean uploadFTP(String ipFTP, String loginFTP, String senhaFTP, String diretorioFTP, String diretorioAndroid, String arquivoFTP){

		try {

			File file = new File(diretorioAndroid);
			File file2 = new File(diretorioAndroid + arquivoFTP);

			if (file.isDirectory()) {

				if(file.list().length > 0){

					FTPClient ftp = new FTPClient();

					ftp.connect(ipFTP);
					ftp.login(loginFTP, senhaFTP);

					ftp.enterLocalPassiveMode();

					ftp.setFileTransferMode(FTPClient.ASCII_FILE_TYPE);
					ftp.setFileType(FTPClient.ASCII_FILE_TYPE);

					ftp.changeWorkingDirectory(diretorioFTP);

					FileInputStream arqEnviar = new FileInputStream( diretorioAndroid + arquivoFTP);

					if (ftp.storeFile(arquivoFTP, arqEnviar)) {

						ftp.logout();
						ftp.disconnect();

						if (file2.delete()) {

							Log.i(CATEGORIA, "Arquivo " + arquivoFTP + " excluído com sucesso");
							return true;

						} else {

							Log.i(CATEGORIA, "Erro ao excluir o arquivo " + arquivoFTP);
							return false;

						}

					} else {

						ftp.logout();
						ftp.disconnect();

						Log.i(CATEGORIA, "ERRO: arquivo " + arquivoFTP + "não foi enviado!");

						return false;
					}


				}
				else
				{
					Log.i(CATEGORIA, "Não existe o arquivo " + arquivoFTP + "neste diretório!");

					return false;
				}

			}
			else
			{

				Log.i(CATEGORIA, "Não é diretório");
				return false;

			}

		} catch (Exception e) {

			Log.i(CATEGORIA, "ERRO FTP: " + e);
			return false;

		}

	}

Conseguiu resolver?

Enviou corretamente: Valeu!!! :smiley:

Mesmo enviando, ele da esse erro no final: 01-27 13:44:40.158: E/uploadFTP(12972): ERRO FTP: org.apache.commons.net.ftp.FTPConnectionClosedException: Connection closed without indication.

Mas ta funcionando >… Valeu :wink:

Não sei se implica em algo, mas retirando as linhas 28 / 29 para de dar o erro indicado

                        //ftp.logout();  
                        //ftp.disconnect();  

Será que dá algum problema? rsrs :lol:

Fala irmão.

No meu caso não deu erro.

É bom colocar estas linhas em algum lugar do seu método para evitar que a conexão fique aberta.

Att

Pessoal alguem me ajude POR Favor !
Estou passando pelo mesmo problema, o arquivo é transferido e salvo, mas ao ser salvo ele é salvo com nome C , vazio e sem formato nenhum !!!
O curioso é que ao fazer o teste em outro ftp o arquivo é salvo corretamente , da tudo certo !

Tentei alterar a conexão, passando o ip e a porta como vocês disseram, mas não muda em nada !
ME AJUDEM por favor srrssr

Obrigado

Você não pode especificar, no arquivo de destino do FTP, um nome tal como “c:\users\jose”. O FTP se embananou com a letra C e desprezou o que veio depois do “:”, então ele acabou criando um arquivo com o nome “C”. OK?

Cara não entendi muito bem o que voce quis dizer, vou postar meu código aqui pra voce me ajudar, tudo bem ?

Classe de acesso ao ftp

[code]public class ServidorFTP {

private String servidor = "Francatalogos FTP";

public void inicia(String localArquivo, String nomePasta, String nomeArquivo) {

    FTPClient ftp = new FTPClient();
    FTPClientConfig config = new FTPClientConfig();
    ftp.configure(config);

    try {
        int responder;
        //Conecta e loga no FTP
        ftp.connect("ftp.francatalogos.com.br");
        ftp.login("####", "#####");
        
        ftp.enterLocalActiveMode();
        ftp.setFileTransferMode(FTPClient.ASCII_FILE_TYPE);
        ftp.setFileType(FTPClient.ASCII_FILE_TYPE);

        System.out.print(ftp.getReplyString());
        responder = ftp.getReplyCode();

        //Obtem o local do arquivo que será armazenado
        FileInputStream file = new FileInputStream(localArquivo);

        //Verifica se o caminho/pasta não existe.
        //seta o caminho no qual o servidor irá trabalhar
        boolean isDirectory = ftp.changeWorkingDirectory("web\\T&TSistemas\\");
        if (!isDirectory) {
            ftp.makeDirectory("web\\T&TSistemas\\");
        }

        ftp.changeWorkingDirectory("web\\T&TSistemas\\");

        //Verifica se o arquivo foi salvo(storeFile).
        if (ftp.storeFile(nomeArquivo, file)) {
            JOptionPane.showMessageDialog(null, "Arquivo armazenado com sucesso.");
        } else {
            JOptionPane.showMessageDialog(null, "Não foi possível armazenar o arquivo.");
            ftp.logout();
            ftp.disconnect();
        }

        if (!FTPReply.isPositiveCompletion(responder)) {
            ftp.disconnect();
            JOptionPane.showMessageDialog(null, "Não foi possível conectar a " + servidor + ".");
            System.exit(1);
        }
        ftp.logout();
    } catch (IOException io) {
        io.printStackTrace();
        JOptionPane.showMessageDialog(null, "Erro ServidorFTP" + io);
    } finally {
        if (ftp.isConnected()) {
            try {
                ftp.disconnect();
                System.out.println("Desconectado !");
            } catch (IOException io) {
            }
        }
    }
}

}
[/code]

Método de gravação !

[code]public void gravarDiretorio() {
try {
ServidorFTP ftp = new ServidorFTP();
ftp.inicia(txtLocalArquivo.getText(), txtNome.getText().replace(" “, “-”), txtLocalArquivo.getText().replace(”\", “-”));
txtLocalArquivo.clear();
} catch (Exception e) {
e.printStackTrace();
JOptionPane.showMessageDialog(null, “Não foi possível armazenar o arquivo no local. ERROR:” + e);
}

}[/code]
  1. No FTP os diretórios são separados por “/”, não por “”
  2. Não gosto de ver nomes de diretórios com “&”. Seria possível testar com um nome de diretório que não tenha espaços ou caracteres especiais?

entanglement Valeu pelas dicas cara, consegui gravar o arquivo, era realmente pelo fato do ftp se “embananar” com os “:”.

Outra coisa, se puder me ajudar …
O arquivo está sendo salvo com o nome do diretório, tipo C-Desktop-imagem.jpg . Mas queria salvar o arquivo apenas com o nome de imagem.jpg, tentei usar o método split mas não deu muito certo, tem alguma dica ?

Só lembrando que java.io.File não representa um arquivo e sim um nome de arquivo ou diretório.

File f = new File ("c:\\users\\rafael ferraro\\desktop\\imagem.jpg");
String s = f.getName(); // resultado: "imagem.jpg"
String dir = f.getParent(); // resultado: "c:\\users\\rafael ferraro\\desktop");

http://docs.oracle.com/javase/6/docs/api/java/io/File.html#getName()

Boa !! Obrigado mais uma vez !! valeu pela ajuda e pelas dicas !