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;
}
}
Enviou corretamente: Valeu!!! 
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 
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]
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 !