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