quinta-feira, 11 de abril de 2019

Linguagem C# - Ftp de Arquivos


Caro leitor, antes de iniciar o artigo, gostaria de desejar um ótimo início de ano 2016. Neste mês irei abordar o uso de FTP na linguagem C# junto utilizando como plataforma de referrência os denominados Formulários Windows.
Para relembrá-lo, FTP (File Transfer Protocol) e traduzindo para o português, “Protocolo de Transferência de Arquivos”, é uma forma bastante rápida e versátil de transferir arquivos, sendo uma das mais usadas na Internet. (Fonte: Wikipedia)
Podemos destacar as duas principais classes quando trabalhamos com FTP na arquitetura .NET, a “FtpWebRequest” (utilizaremos neste artigo) e a “FtpWebResponse”. A classe “FtpWebRequest” implementa um cliente de protocolo de transferência de arquivo. Já a “FtpWebResponse” encapsula a resposta do servidor FTP a uma solicitação. Ambas são de origem do Namespace “System.Net” e do Assembly “System.dll”. Segue abaixo hierarquia de herança para entendermos melhor.

FtpWebRequest
FtpWebResponse

Para este artigo criaremos uma classe chamada “Ftp” contendo algumas propriedades e métodos necessários. A partir desta classe criaremos uma interface para instanciá-la posteriormente. Nesta primeira parte codificaremos apenas o método chamado “Upload”, o qual será responsável por encapsular e enviar dados a um servidor FTP.

Criando a Classe Ftp

Crie um projeto desde o início do tipo Windows Forms clicando em (File/New/Project.../Windows Forms Application). Para adicionar uma classe dê um clique com o botão direito sobre a “Solution” escolhendo “Add/New Item...” e definindo o nome como “Ftp”. Ver Imagem 01.

Figura 01: Criando a classe Ftp.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

Deveremos declarar alguns namespaces para trabalhar com métodos de classes referentes ao FTP, Arquivos e Streams.

using System.IO;
using System.Net;

namespace WindowsFormsFTP
{
    public class Ftp
    {

Teremos alguns atributos privados, sendo o endereço do FTP, usuário, senha e uma variável “ftprequest” a qual será feita a requisição do serviço FTP.

        private string enderecoFtp = null;
        private string usuario = null;
        private string senha = null;
        private FtpWebRequest ftpRequest = null;
     

No método construtor passaremos por parâmetro o endereço, usuário e senha.

        public Ftp(string endFtp, string usu, string sen)
        {
            enderecoFtp = endFtp;
            usuario = usu;
            senha = sen;
        }
O Método Upload será encarregado de efetuar toda a tarefa de subir o arquivo ao servidor por FTP. Passaremos por parâmetro o caminho do arquivo remoto e local. Faremos um tratamento através do bloco “try/catch” retornando um valor booleano, nos informando sucesso na operação. Primeiramente instanciamos a variável FTPRequest informando o endereço completo do arquivo FTP e logo em seguida atribuímos algumas propriedades, como por exemplo: “Method” para o tipo de operação Upload, “Proxy” se possui ou não proxy, “UseBinary” para dados binários e “Credencials” para inserir usuário e senha. O uso da classe “FileInfo”, “FileStream” e “Stream” irá transportar o arquivo para o servidor FTP.

        public bool Upload(string remoteFile, string localFile)
        {
            try
            {
ftpRequest = (FtpWebRequest)FtpWebRequest.Create(new Uri(string.Format("{0}/{1}", enderecoFtp, remoteFile)));
                  ftpRequest.Method = WebRequestMethods.Ftp.UploadFile;
                  ftpRequest.Proxy = null;
                  ftpRequest.UseBinary = true;
ftpRequest.Credentials = new NetworkCredential(usuario, senha);

FileInfo arquivo = new FileInfo(string.Format("{0}", localFile));
                  byte[] fileContents = new byte[arquivo.Length];

                  using (FileStream fr = arquivo.OpenRead())
                  {
fr.Read(fileContents, 0, Convert.ToInt32(arquivo.Length));
                  }

                  using (Stream writer = ftpRequest.GetRequestStream())
                  {
writer.Write(fileContents, 0, fileContents.Length);
                  }
                  ftpRequest = null;
                  return true;
            }
            catch
            {
                return false;
            }
        }           
    }
}

Criando um exemplo prático
Nosso formulário deverá conter a seguinte estrutura: 4 pares de Labels e TextBox sendo (Endereço Ftp, Usuário, Senha e Caminho do Arquivo local), um botão para localizar o arquivo a ser enviado e por último o botão “Upload”, o qual fará o trabalho de subir o arquivo no servidor FTP. Ver Imagem 02.

Figura 02: Criando a interface gráfica para consumir a classe Ftp.

A função “consistencias” será responsável por obrigar o preenchimento de todos os campos do formulário.
private bool consistencias()
{
       if (txtEndereco.Text.Length <= 0)
       {
MessageBox.Show("O campo Endereço Ftp é de preenchimento obrigatório!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
             return false;
       }

       if (txtUsuario.Text.Length <= 0)
       {
MessageBox.Show("O campo Usuário é de preenchimento obrigatório!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
              return false;
       }

       if (txtSenha.Text.Length <= 0)
       {
MessageBox.Show("O campo Senha é de preenchimento obrigatório!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
              return false;
       }

       if (txtArquivo.Text.Length <= 0)
       {
MessageBox.Show("O campo Arquivo é de preenchimento obrigatório!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Warning);
              return false;
       }

       return true;
}

No evento “Click” do botão procurar iremos implementar a classe “OpenFileDialog”, a qual irá escolher o arquivo para ser enviado ao servidor. Será necessário definir algumas propriedades de controle como: “MultiSelect” para permitir a multi-seleção de arquivos, “Title” da caixa de pesquisa, “InitialDirectory” para o diretório inicial, “Filter” para filtrar arquivos, “CheckFileExists” e “CheckPathExists” para identificar se existe arquivo e diretório e “RestoreDirectory” para restaurar diretórios. Por final atribuíremos ao “txtArquivo”.       

private void btnProcurarArquivo_Click(object sender, EventArgs e)
{
            OpenFileDialog filedialog = new OpenFileDialog();
            filedialog.Multiselect = false;
            filedialog.Title = "Selecionar Arquivos";
            filedialog.InitialDirectory = @"C:\";
            filedialog.Filter = "All files (*.*)|*.*";
            filedialog.CheckFileExists = true;
            filedialog.CheckPathExists = true;
            filedialog.RestoreDirectory = true;

            DialogResult dr = filedialog.ShowDialog();
            if (dr == System.Windows.Forms.DialogResult.OK)
            {
                txtArquivo.Text = filedialog.FileName;
            }
}
No evento “Click” do botão “Upload” iremos utilizar a função “consistências” para logo em seguida instanciar a classe “Upload” inserindo todos os valores dos “TextBoxes” conforme listagem de código abaixo.

private void btnUpload_Click(object sender, EventArgs e)
{
            if (consistencias() == true)
            {
string nomeArquivo = System.IO.Path.GetFileName(txtArquivo.Text);
Ftp ftp = new Ftp(txtEndereco.Text,   txtUsuario.Text, txtSenha.Text);

if (ftp.Upload("thiago/" + nomeArquivo, txtArquivo.Text))
MessageBox.Show(string.Format("Arquivo {0} enviado ao servidor com sucesso!", nomeArquivo), "Informação", MessageBoxButtons.OK, MessageBoxIcon.Information);
                  else
MessageBox.Show(string.Format("Ocorreu uma falha no envio do arquivo {0} ao servidor!", nomeArquivo), "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }


Podemos conferir o exemplo em Run-time na Figura 03.

Figura 03: Exemplo em Run-time.

Conclusões

Vimos neste artigo uma forma simples e prática de “Upload” de arquivos por FTP usando a plataforma .NET. Criamos uma classe para esta tarefa podendo ser reutilizada conforme a necessidade do programador. Para o mês que vem irei implementar o método para “Download” de arquivos.
Fica aí a dica, um abraço e até o mês que vem!

Referências

https://pt.wikipedia.org/wiki/File_Transfer_Protocol
https://msdn.microsoft.com/pt-br/library/system.net.ftpwebrequest(v=vs.110).aspx


Nenhum comentário:

Postar um comentário