Exemplo de código de cliente FTP (código-fonte em C#): conectando-se ao servidor FTP da DriveHQMuitos usuários perguntaram como se conectar ao servidor FTP do DriveHQ em seus próprios projetos de software. Nesta mensagem, gostaríamos de fornecer algumas informações gerais sobre FTP, seguidas de um exemplo de código-fonte em C#.
A DriveHQ oferece serviço de hospedagem de servidor FTP. Damos suporte aos protocolos FTP e FTPS. Uma das principais vantagens do nosso serviço FTP é a integração perfeita com nossa ampla gama de serviços de TI em nuvem. Os usuários podem acessar seus arquivos FTP usando um navegador da web. unidade mapeada (WebDAV) ou o software cliente DriveHQ FileManager. Eles também podem usar nossa ferramenta de administração de grupos baseada na web para criar e gerenciar usuários FTP (subusuários).
O protocolo FTP padrão é considerado inseguro, pois transmite dados sem criptografia. Para uma segurança SSL robusta, você pode usar o FTPS (FTP sobre SSL/TLS). Existem dois métodos para ativar a segurança SSL:
Implícito: O cliente FTP conecta-se diretamente a um número de porta FTPS especial (o padrão é 990);
Explícito (FTPES): O cliente FTP se conecta à porta FTP padrão número 21 e, em seguida, emite um comando STARTTLS para atualizar a segurança.
O servidor FTP da DriveHQ suporta FTPS e FTPES. A maioria dos aplicativos cliente FTP também suporta FTPS e FTPES, como FileZilla, CuteFTP, WsFTP, SmartFTP, WinSCP e Fetch, entre outros.
Existe outro protocolo seguro de transferência de arquivos chamado SFTP, que muitas vezes é confundido com "FTP seguro"; na verdade, significa "Protocolo de Transferência de Arquivos SSH", um protocolo de transferência de arquivos completamente diferente. Do ponto de vista da segurança, SSL/TLS e SSH são praticamente iguais. Claramente, o SSL/TLS é mais popular que o SSH. O servidor FTP da DriveHQ não oferece suporte a SFTP, pois não vemos uma necessidade significativa para ele.
FTP em modo ativo e passivo:
Uma conexão FTP pode incluir duas conexões TCP (canais): o canal de comando e o canal de dados. O canal de comando é usado para enviar comandos FTP; o canal de dados é usado para transferir grandes quantidades de dados. O FTP em Modo Ativo exige que o servidor FTP se conecte ao cliente FTP para estabelecer a conexão de dados. Isso geralmente é considerado inseguro e é bloqueado por muitos firewalls/roteadores. O FTP em Modo Passivo exige que o cliente FTP se conecte ao servidor FTP em uma porta diferente. É considerado seguro e raramente é bloqueado. O servidor FTP da DriveHQ suporta FTP Ativo e Passivo. No entanto, se o seu roteador/firewall ou software de segurança bloquear o FTP Ativo, ele não funcionará. É interessante notar que a maioria dos roteadores mais recentes suporta FTP Ativo.
Observação: o cliente FTP de linha de comando da Microsoft não oferece suporte ao FTP passivo. Quase todos os outros programas clientes de FTP oferecem suporte tanto ao FTP ativo quanto ao passivo.
FTP e ProFTP
A DriveHQ possui dois servidores FTP: ftp.drivehq.com, acessível a todos os usuários; e proftp.drivehq.com, disponível apenas para membros pagantes (incluindo subusuários de uma conta de grupo paga). Como o proftp.drivehq.com é exclusivo para membros pagantes, ele não oferece suporte a FTP anônimo. Para mais informações sobre nosso serviço de hospedagem de servidores FTP, visite [link para o site]:
http://www.drivehq.com/servicemanual.aspx#_Toc265186728
Código-fonte de exemplo de um cliente FTP
O código-fonte C# a seguir é fornecido "como está", sem qualquer suporte. Sinta-se à vontade para usá-lo em seu próprio software ou redistribuí-lo. O código de exemplo mostra como conectar-se ao nosso servidor FTP e executar comandos FTP, como LIST, GET e PUT; você também pode ver como configurá-lo para usar FTP passivo e SSL.
usando o sistema;
usando System.Collections.Generic;
usando System.Linq;
usando System.Text;
usando System.Threading.Tasks;
Usando System.Net;
usando System.IO;
usando System.Security.Cryptography.X509Certificates;
///
/// Direitos autorais (c) 2003-2016, Drive Headquarters, Inc.
///
/// O código de exemplo do cliente FTP mostra como conectar-se ao servidor FTP da DriveHQ usando C#.
/// Você pode usar o código ou redistribuí-lo gratuitamente. O código é fornecido "NO ESTADO EM QUE SE ENCONTRA", sem licença
/// A DriveHQ não se responsabiliza por qualquer suporte ou garantia decorrente do uso do código.
///
namespace FTPClientSample
{
Programa de aula
{
static string ftpServer = "ftp.drivehq.com"; // você também pode usar proftp.drivehq.com se tiver uma conta paga.
string estática username = "SEU_NOME_DE_USUÁRIO"; // Seu nome de usuário do DriveHQ
string estática senha = "SUA_SENHA"; // Sua senha do DriveHQ
static void Main(string[] args)
{
// Listar uma pasta no servidor FTP
//Lista("/");
// Baixar um arquivo do servidor FTP
//BaixarArquivo("NomeDoArquivoDoServidor.jpg", @"c:\temp\NomeDoArquivoDoCliente.jpg");
// Enviar um arquivo para o servidor FTP
UploadFile(@"c:\temp\ClientFileName.jpg", "/temp/ServerFileName.jpg");
}
///
/// Faça o upload de um arquivo para o servidor FTP.
///
/// um caminho de arquivo local
/// o caminho no servidor FTP, como /temp/nome_do_arquivo
///
public static bool UploadFile(string srcFilePath, string destFilePath = null)
{
se (String.IsNullOrWhiteSpace(srcFilePath))
lançar nova ArgumentNullException("Caminho do arquivo de origem.");
se (String.IsNullOrWhiteSpace(destFilePath))
caminhoArquivoDestino = Caminho.ObterNomeArquivo(caminhoArquivoOrigem);
Uri serverUri = GetUri(destFilePath);
// O serverUri deve começar com o esquema ftp://.
se (serverUri.Scheme != Uri.UriSchemeFtp)
retornar falso;
FtpWebRequest solicitação = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.UploadFile);
// Ler o conteúdo do arquivo para um array de bytes
FileStream sourceStream = new FileStream(srcFilePath, FileMode.Open, FileAccess.Read);
byte[] fileContent = new byte[sourceStream.Length];
sourceStream.Read(fileContent, 0, fileContent.Length);
sourceStream.Close();
// Enviar o conteúdo do arquivo para o servidor FTP
request.ContentLength = fileContent.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(fileContent, 0, fileContent.Length);
requestStream.Close();
FtpWebResponse resposta = (FtpWebResponse)request.GetResponse();
Console.WriteLine("Status da resposta: {0} - {1}", response.StatusCode, response.StatusDescription);
retornar verdadeiro;
}
///
/// Faça o download do arquivo srcFilePath no servidor FTP para o arquivo destFilePath. Se for nulo, salve na pasta atual.
///
///
public static bool DownloadFile(string srcFilePath, string destFilePath = null)
{
se (String.IsNullOrWhiteSpace(srcFilePath))
lançar nova ArgumentNullException("Caminho do arquivo de origem.");
se (String.IsNullOrWhiteSpace(destFilePath))
caminhoArquivoDestino = Caminho.ObterNomeArquivo(caminhoArquivoOrigem);
Uri serverUri = GetUri(srcFilePath);
//// O serverUri deve começar com o esquema ftp://.
se (serverUri.Scheme != Uri.UriSchemeFtp)
retornar falso;
FtpWebRequest solicitação = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.DownloadFile);
FtpWebResponse resposta = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
FileStream fileStream = new FileStream(destFilePath, FileMode.OpenOrCreate, FileAccess.Write);
byte[] buffer = novo byte[32 * 1024];
enquanto(verdadeiro) {
int bytesRead = responseStream.Read(buffer, 0, buffer.Length);
se (bytesRead == 0)
quebrar;
fileStream.Write(buffer, 0, bytesRead);
}
fileStream.Close();
Console.WriteLine("Status da resposta: {0} - {1}", response.StatusCode, response.StatusDescription);
retornar verdadeiro;
}
///
/// Liste o conteúdo de uma pasta FTP
///
///
public static string List(string caminho)
{
Uri serverUri = GetUri(caminho);
//// O serverUri deve começar com o esquema ftp://.
se (serverUri.Scheme != Uri.UriSchemeFtp)
retornar "";
FtpWebRequest solicitação = CreateFtpRequest(serverUri, WebRequestMethods.Ftp.ListDirectory);
FtpWebResponse resposta = (FtpWebResponse)request.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream());
string result = sr.ReadToEnd();
Console.WriteLine("Status da resposta: {0} - {1}", response.StatusCode, response.StatusDescription + "\r\n" + result);
retornar resultado;
}
private static FtpWebRequest CreateFtpRequest(Uri serverUri, string method)
{
FtpWebRequest solicitação = (FtpWebRequest)WebRequest.Create(serverUri);
request.EnableSsl = true;
request.UsePassive = true;
request.UseBinary = true;
request.KeepAlive = true;
solicitação.Credenciais = novo NetworkCredential(nome de usuário, senha);
request.Method = método;
retornar solicitação;
}
privado estático Uri GetUri(string caminhoArquivoRemoto)
{
Uri ftpServerUri = new Uri("ftp://" + ftpServer);
retornar novo Uri(ftpServerUri, remoteFilePath);
}
}
}