Problema FTP Client não envia arquivos grandes

10 respostas
D

Pessoal estou tendo problema com o commons-net-2.0
Estou usando ele para enviar um arquivo via FTP.
Porem o código funciona perfeitamente até arquivo de uns 3mb, estou tentando enviar um arquivo de 25mb e não está indo.
Tirei um dúvida que não é problema do meu FTP, enviei utilizando o Fillezila e o arquivo foi normalmente.
Assim que executo ele fica processando, passa 10min, 30min, 1h e não conclui o envio. Minha net é de 1mb up, não deveria demorar tanto, que até pelo Fillezila não demora.

Obs.: O código está enviando arquivos, não apresenta erro. Só não envia arquivos grandes.
Segue o código…

package br.com.l2spartan.utils;

import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;

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

/**
 * @author L0ngh0rn
 */
@SuppressWarnings(
{
    "UseOfSystemOutOrSystemErr", "CallToThreadDumpStack"
})
public class FTPUtils
{

    public FTPClient estabeleceConexao(String servidor, String usuario, String senha)
    {
        FTPClient ftp = new FTPClient();
        try
        {
            ftp.connect(servidor);
            // verifica se conectou com sucesso!
            if (FTPReply.isPositiveCompletion(ftp.getReplyCode()))
            {
                ftp.login(usuario, senha);
                return ftp;
            }
            else
            {
                // erro ao se conectar
                ftp.disconnect();
                System.out.println("Conexão recusada");
                ftp = null;
            }
        }
        catch (Exception e)
        {
            System.out.println("Ocorreu um erro: " + e);
        }
        return ftp;
    }

    public static boolean transfereArqFTP(String servidor, String usuario, String senha, List<File> listaArquivos, String diretorio)
    {
        String nomeArquivo = null;
        FTPClient ftp = new FTPClient();
        try
        {
            ftp.connect(servidor);
            //ftp.connect("localhost", 8012);
            // verifica se conectou com sucesso!
            if (FTPReply.isPositiveCompletion(ftp.getReplyCode()))
            {
                if (!ftp.login(usuario, senha))
                {
                    ftp.disconnect();
                    System.out.println("Login recusado");
                    return false;
                }
            }
            else
            {
                // erro ao se conectar
                ftp.disconnect();
                System.out.println("Conexão recusada");
                return false;
            }
            String dir = "";
            for (int i = 0; i < diretorio.length(); i++)
            {
                if (!diretorio.substring(i, i + 1).equals("\\"))
                {
                    dir += diretorio.substring(i, i + 1);
                }
                else
                {
                    if (!ftp.changeWorkingDirectory(dir.trim()))
                    {
                        ftp.disconnect();
                        System.out.println("Diretório de envio informado inexistente");
                        return false;
                    }
                    else
                    {
                        dir = "";
                    }
                }
            }
            if (!ftp.changeWorkingDirectory(dir.trim()))
            {
                ftp.disconnect();
                System.out.println("Diretório de envio informado inexistente");
                return false;
            }
            // para cada arquivo informado...
            for (Iterator iter = listaArquivos.iterator(); iter.hasNext();)
            {
                File arquivo = (File) iter.next();
                // abre um stream com o arquivo a ser enviado
                InputStream is = new FileInputStream(arquivo);
                // pega apenas o nome do arquivo
                int idx = arquivo.getName().lastIndexOf(File.separator);
                if (idx < 0)
                {
                    idx = 0;
                }
                else
                {
                    idx++;
                }
                nomeArquivo = arquivo.getName();

                // ajusta o tipo do arquivo a ser enviado
                if (arquivo.getName().endsWith(".txt"))
                {
                    ftp.setFileType(FTPClient.ASCII_FILE_TYPE);
                }
                else if (arquivo.getName().endsWith(".jpg"))
                {
                    ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
                }
                else
                {
                    ftp.setFileType(FTPClient.ASCII_FILE_TYPE);
                }
                VerificaStatus vs = new VerificaStatus(ftp);
                vs.start();
                System.out.println("Enviando arquivo " + nomeArquivo + "...");
                // faz o envio do arquivo
                if (!ftp.storeFile(nomeArquivo, is))
                {
                    ftp.disconnect();
                    System.out.println("Não foi possível enviar o arquivo " + nomeArquivo + "...");
                    return false;
                }
                else
                {
                    System.out.println("Arquivo " + nomeArquivo + " enviado com sucesso!");
                }
                vs.parar();
            }
            ftp.disconnect();
            return true;

        }
        catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
        catch (Throwable e)
        {
            e.printStackTrace();
            return false;
        }
    }

    public static boolean getArquivosFTP(String servidor, String usuario, String senha, String dirRetorno, String diretorioRecebimento)
    {
        try
        {
            FTPClient ftp = new FTPClient();
            ftp.connect(servidor);
            // verifica se conectou com sucesso!
            if (FTPReply.isPositiveCompletion(ftp.getReplyCode()))
            {
                if (!ftp.login(usuario, senha))
                {
                    ftp.disconnect();
                    System.out.println("Login recusado");
                    return false;
                }
            }
            else
            {
                // erro ao se conectar
                ftp.disconnect();
                System.out.println("Conexão recusada");
                ftp = null;
            }
            String dir = "";
            for (int i = 0; i < dirRetorno.length(); i++)
            {
                if (!dirRetorno.substring(i, i + 1).equals("\\"))
                {
                    dir += dirRetorno.substring(i, i + 1);
                }
                else
                {
                    if (!ftp.changeWorkingDirectory(dir.trim()))
                    {
                        ftp.disconnect();
                        System.out.println("Diretório de recebimento informado inexistente");
                        return false;
                    }
                    else
                    {
                        dir = "";
                    }
                }
            }
            if (!ftp.changeWorkingDirectory(dir.trim()))
            {
                ftp.disconnect();
                System.out.println("Diretório de recebimento informado inexistente");
                return false;
            }
            FTPFile[] files = ftp.listFiles();
            for (int i = 2; i < files.length; i++)
            {
                if (files[i].getName().endsWith(".txt"))
                {
                    ftp.setFileType(FTPClient.ASCII_FILE_TYPE);
                }
                else if (files[i].getName().endsWith(".jpg"))
                {
                    ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
                }
                else
                {
                    ftp.setFileType(FTPClient.ASCII_FILE_TYPE);
                }
                if (files[i].getName().startsWith("requisicao") || files[i].getName().startsWith("fornecedor") || files[i].getName().startsWith("pedido"))
                {
                    File file = new File(diretorioRecebimento + "\\" + files[i].getName());
                    OutputStream os = new FileOutputStream(file);
                    if (!ftp.retrieveFile(files[i].getName(), os))
                    {
                        System.out.println("Não foi possível trasnferir o arquivo " + files[i].getName() + "...");
                    }
                    else
                    {
                        System.out.println("Arquivo " + files[i].getName() + " trasnferido com sucesso!");
                    }
                }
            }
            ftp.disconnect();
            return true;
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return false;
        }
    }

    public static class VerificaStatus extends Thread
    {

        private boolean parar = false;
        private FTPClient _ftp;

        public VerificaStatus(FTPClient ftp)
        {
            _ftp = ftp;
        }

        @Override
        public void run()
        {
            while (!parar)
            {
                if (_ftp.isConnected())
                {
                    System.out.println("Conexao Ativa!");
                }
                else
                    System.out.println("Conexao Inativa!");
                sleepx(5000);
            }
        }

        public void sleepx(long ms)
        {
            Long horaInicial = System.currentTimeMillis();
            while (true)
            {
                try
                {
                    Thread.sleep(ms);
                    break;
                }
                catch (Exception e)
                {
                    if (System.currentTimeMillis() - ms > horaInicial)
                        break;
                }
            }
        }

        private void parar()
        {
            parar = true;
        }
    }
}
package br.com.l2spartan;

import br.com.l2spartan.utils.FTPUtils;
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

/**
 * @author L0ngh0rn
 */
@SuppressWarnings(
{
    "UseOfSystemOutOrSystemErr", "CallToThreadDumpStack"
})
public class Main
{
    public static void main(String[] args)
    {
        try
        {
            Scanner sc = new Scanner(System.in);
            String diretorioDestino = "/web/Dados";
            List<File> listaArquivos = new ArrayList<File>();
            String arquivo = "d:/arquivo.rar";
            //String arquivo = "d:/buffer.py";
            File file = new File(arquivo);
            if (file.isFile())
                listaArquivos.add(file);

            if (FTPUtils.transfereArqFTP("ftp.com.br", "user", "senha", listaArquivos, diretorioDestino))
                System.out.println("Tranferencia feita com sucesso.");
            else
                System.out.println("Houve problema na tranferencia.");
        }
        catch (Exception e)
        {
            System.out.println("Ocorreram problemas ao executar.");
            e.printStackTrace();
        }
    }

    public static File[] listarArquivos(String path, final String ext, final Boolean desc)
    {
        File F = new File(path);
        File[] files = F.listFiles(new FileFilter()
        {
            public boolean accept(File pathname)
            {
                return pathname.getName().toLowerCase().endsWith(ext);
            }
        });

        Arrays.sort(files, new Comparator<File>()
        {
            public int compare(File o1, File o2)
            {
                return Long.valueOf(o2.lastModified()).compareTo(Long.valueOf(o1.lastModified()));
            }
        });

        return files;
    }
}

Se alguem passou por isso ou tenha alguma solução, preciso muito de ajuda. Muita coisa ainda não está utilizando justamente por causa desse problema, não dei continuidade ao meu sistema.

Aguardo.

10 Respostas

B

acontece algum tipo de excecao?

D

Nenhuma, até mesmo criei uma forma de verificar se a conexão está ativa. E sempre retorna true.

Porem que com arquivo pequenos ele envia normalmente.

B

humm, estranho …
ja tentou setar o tipo como sempre sendo binario?

D

Não mudou nada. Deixei sempre como binary.

Agora estou imprimindo o Status. Não sei se pode ajudar.


Conexao Ativa! Status: 211-Microsoft FTP Service status:
Logged in user: user
TYPE: BINARY; FORM: NONPRINT; STRUcture: FILE; transfer MODE: STREAM
Data connection: established
211 End of status.

B

quando eh que vc seta o modo de envio? antes ou depois de abrir a conexao? nao tenho total certeza se isso faz alguma diferenca, creio que seja indiferente … mas seria outro teste que eu faria

D

Estabeleço a conexão, depois acesso o diretório que quero armazena o arquivo, ai sim eu envio o arquivo que seria na linha 139.

Acreito que essa seja a sequencia, pq ate mesmo ele envia os arquivos, mas não envia arquivos grandes.

B

ok,
noto que vc esta transferindo uma lista de arquivos, ja fez algum teste transferindo apenas um desses arquivos grandes? que estao atualmente causando problemas?

B

creio que isso seja relacionado ao seu problema
https://issues.apache.org/jira/browse/NET-258

D

Mesmo assim não foi… fica muito tempo e não vai.

Porem consigui gerar um excessao

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: TYPE: BINARY; FORM: NONPRINT; STRUcture: FILE; transfer MODE: STREAM at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:315) at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:490) at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:534) at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:476) at org.apache.commons.net.ftp.FTPClient.__storeFile(FTPClient.java:374) at org.apache.commons.net.ftp.FTPClient.storeFile(FTPClient.java:1379) at br.com.l2spartan.utils.FTPUtils.transfereArqFTP(FTPUtils.java:117) at br.com.l2spartan.Main.main(Main.java:35)

F

Estou com o mesmo problema, alguém conseguiu resolver?

Criado 10 de setembro de 2010
Ultima resposta 11 de set. de 2013
Respostas 10
Participantes 3