none
Incluir arquivo em servidor FTP C# ASP.net RRS feed

  • Pergunta

  • Boa Tarde

    Preciso desenvolver uma funcionalidade para inserir e baixar arquivos de um servidor FTP em ASP.net C#.

    Já busquei aqui no MSDN e Google soluções para o meu problema e encontrei, porém não consigo fazer com que funcione corretamente.

    Meu código que insere o arquivo no FTP seria o abaixo, porém quando o executo me apresenta o seguinte erro:

    "O servidor remoto retornou um erro: (550) Arquivo não disponível (isto é, arquivo não encontrado, sem acesso)."

    Porém a pasta Nova no FTP existe, já coloquei barra no final, porém me retorna outro erro:"O URI solicitado é inválido para o comando de FTP."

    O arquivo que quero inserir também está correto.

    Consigo acessar este FTP tanto pelo Browser como pelo WinExplorer na mesma máquina que desenvolvo e não me dá problema.

    Já inseri configurações de proxy também, mas também me apresentou o seguinte erro:"Não há suporte para o comando de FTP solicitado durante o uso do proxy HTTP.". Sendo que adicionei as seguinte linhas:

    	ftp.Proxy = new WebProxy("192.168.1.254",3128);
            ftp.Proxy.Credentials = new NetworkCredential("usuario", "senha");
    e retirei a linha que adiciona valor NULL ao proxy.

    Alguém consegue me dar um auxílio aí?

    Agradeço.

    FileInfo fileInfo = new FileInfo("C:\\Users\\Teste\\Desktop\\teste.txt");
                FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create("ftp://ftp.dominio.com.br/Nova");
                ftp.Credentials = new NetworkCredential("usuario", "senha");
                ftp.KeepAlive =false;
                ftp.Proxy = null;
                ftp.UsePassive =false;
                ftp.Method = WebRequestMethods.Ftp.UploadFile;
                ftp.UseBinary =true;
                ftp.ContentLength = fileInfo.Length;
                int iBufferLength = 1;
                byte[] buff = new byte[iBufferLength];
                int contentLen;
                FileStream fs = fileInfo.OpenRead();
                Stream strm = ftp.GetRequestStream();
                contentLen = fs.Read(buff, 0, iBufferLength);
                
                while (contentLen != 0)
                {
                    strm.Write(buff, 0, iBufferLength);
                    contentLen = fs.Read(buff, 0, iBufferLength);
                }
                strm.Close();
                fs.Close(); 


    Pedro Henrique Peres

    quarta-feira, 4 de julho de 2012 19:45

Respostas

  • Bom Dia,

    Após muita busca, e resfrescar a cabeça, consegui resolver meu problema.

    Acredito que um dos motivos de não estar funcionando seria o fato de eu não inserir o nome do arquivo na hora de instanciar o FtpWebRequest,

    Outro motivo que também notei, seria o fato de eu NÃO estar utilizando conexão passiva.

    Após resolver esses pequenos detalhes, finalmente consegui o Upload do arquivo.

    Obrigado pela atenção.

    Segue o código atual:

    	FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create("ftp://usuario:senha@ftp.host.com.br/Nova/teste.txt");
            ftp.Method = WebRequestMethods.Ftp.UploadFile;
                     
                ftp.KeepAlive = false;
                ftp.UsePassive = true;
                
    
                ftp.Proxy = null;
                ftp.UseBinary = true;
    
                StreamReader stream = new StreamReader("C:\\Users\\Pedro\\Desktop\\teste.txt");
                byte[] fileContents = Encoding.UTF8.GetBytes(stream.ReadToEnd());
                stream.Close();
                ftp.ContentLength = fileContents.Length;
                                     
                Stream requestStream = ftp.GetRequestStream();
                requestStream.Write(fileContents, 0, fileContents.Length);
                requestStream.Close();
    
                FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
    
                Console.WriteLine("Upload de arquivo Completo, status {0}", response.StatusDescription);


    Pedro Henrique Peres

    • Marcado como Resposta pedrucaperes13 quinta-feira, 5 de julho de 2012 14:06
    quinta-feira, 5 de julho de 2012 14:06

Todas as Respostas

  • Bom Dia,

    Após muita busca, e resfrescar a cabeça, consegui resolver meu problema.

    Acredito que um dos motivos de não estar funcionando seria o fato de eu não inserir o nome do arquivo na hora de instanciar o FtpWebRequest,

    Outro motivo que também notei, seria o fato de eu NÃO estar utilizando conexão passiva.

    Após resolver esses pequenos detalhes, finalmente consegui o Upload do arquivo.

    Obrigado pela atenção.

    Segue o código atual:

    	FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create("ftp://usuario:senha@ftp.host.com.br/Nova/teste.txt");
            ftp.Method = WebRequestMethods.Ftp.UploadFile;
                     
                ftp.KeepAlive = false;
                ftp.UsePassive = true;
                
    
                ftp.Proxy = null;
                ftp.UseBinary = true;
    
                StreamReader stream = new StreamReader("C:\\Users\\Pedro\\Desktop\\teste.txt");
                byte[] fileContents = Encoding.UTF8.GetBytes(stream.ReadToEnd());
                stream.Close();
                ftp.ContentLength = fileContents.Length;
                                     
                Stream requestStream = ftp.GetRequestStream();
                requestStream.Write(fileContents, 0, fileContents.Length);
                requestStream.Close();
    
                FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
    
                Console.WriteLine("Upload de arquivo Completo, status {0}", response.StatusDescription);


    Pedro Henrique Peres

    • Marcado como Resposta pedrucaperes13 quinta-feira, 5 de julho de 2012 14:06
    quinta-feira, 5 de julho de 2012 14:06
  • Eu sei que é velho esse post, mas tem outra maneira de fazer se quiser com WebClient.

    var uri = new Uri("ftp://ftp.host.net/pasta-ftp/nome_do_seu_arquivo.txt"); 
                using (var webClient = new System.Net.WebClient())
                {
                    webClient.Credentials = new System.Net.NetworkCredential("user", "password");
                    webClient.UploadFile(uri, @"c:\temp\nome_do_seu_arquivo.txt");
                }


    segunda-feira, 15 de junho de 2015 17:49
  • Muito obrigado por postar esta solução. Mesmo após 6 anos depois e este post continua sendo útil.
    quarta-feira, 23 de maio de 2018 13:34