[Resolvido] Envio de Arquivo TXT para FTP indo Vazio

12 respostas
R

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);
	
	}

12 Respostas

F

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;

		}

	}
F

Conseguiu resolver?

R

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:

R

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:

F

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

R

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

E

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?

R

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

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) {
                }
            }
        }
    }
}

Método de gravação !

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);
        }

    }
E
  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?
R

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 ?

E

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()

R

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

Criado 26 de janeiro de 2012
Ultima resposta 27 de fev. de 2013
Respostas 12
Participantes 4