Como extrair um arquivo de um diretório FTP?

Bom dia,

como podemos extrair imagens de um destino FTP ?

1 curtida

Olá @anael_ribeiro!

A técnica que vou mostrar arqui consiste em usar um código C# para baixar o arquivo do FTP para o servidor, e em seguida, montar uma URL para download pelo Latromi e devolve-la para o usuário.

O fluxo do arquivo será este:

FTP → Servidor do Latromi → Navegador do Usuário

Formulário

Siga os passos abaixo no Formulário Dinâmico.

Variáveis

Crie as variáveis a seguir:

  • Adicione uma variável para receber o caminho remoto do arquivo. Neste exemplo, a variável se chama ftpFilePath.
  • Adicione uma variável para receber a URL para download pelo Latromi. Neste exemplo, a variável se chama outputUrl.

Procedimentos

No procedimento onde você deseja que ocorra o download, adicione as instruções abaixo:

  1. Adicione uma instrução “Preencher Campos e Variáveis” para preencher a variável “ftpFilePath” com o caminho do arquivo no FTP (algo como /www/meuarquivo.jpg). Você pode buscar o caminho do arquivo do banco de dados usando uma “Record”.
  2. Adicione uma instrução “Executar Código C#”. Aqui você adicionar o código a seguir para baixar o arquivo do FTP, substituindo os valores referentes ao endereço, usuário e senha do FTP:
    using System.IO;
    using System.Net;
    
    // Dados do FTP
    string ftphost = "ftp.meudominio.com.br";
    // Caminho remoto do arquivo. Algo como "/www/file.jpg"
    string ftpfilepath = Variables["ftpFilePath"].Value?.ToString();
    
    string ftpfullpath = "ftp://" + ftphost + ftpfilepath;
    string ftpUser = "usuario";
    string ftpPassword = "senha";
    
    // Caminho fisico onde o arquivo será criado
    // Algo como: c:\inetpub\wwwlatromi\Web\Temp\Users\usuario\FTP_Downloads\arquivo.jpg
    string outputfilepath = Path.Combine(Environment.TempFolder, "FTP_Downloads", ftpfilepath.Split('/').LastOrDefault());
    
    // Cria a pasta "FTP_Downloads"
    Directory.CreateDirectory(Path.GetDirectoryName(outputfilepath));
    
    // URL para baixar o arquivo pelo LATROMI
    // Algo como: https://latromi.meudominio.com.br/web/Temp/Users/usuario/FTP_Downloads/arquivo.jpg
    string outputUrl = Environment.TempFolderUrl + @"\FTP_Downloads\" + ftpfilepath.Split('/').LastOrDefault();
    
    try
    {
       using (WebClient request = new WebClient())
       {
           // Passa usuário e senha do FTP.
           request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
           
           // Faz download do arquivo
           request.DownloadFile(ftpfullpath, outputfilepath);
       }
    }
    catch (Exception ex)
    {
       throw new InvalidOperationException(ex.Message + "\t" + ex.InnerException?.Message);
    }
    
    // Preenche a variável do Formulário com a URL do arquivo para download
    Variables["outputUrl"].Value = outputUrl;
    
  3. Por último, adicione uma instrução “Abrir URL”, selecione o alvo “Download” e no URL, use apenas a marcação da variável {?VAR outputUrl}:

Boa noite @daniel.giacomelli estou tendo um problema técnico ao extrair as informações do FTP para o diretório no servidor.

O código roda como deveria ser, porém, os arquivos estão subindo zerados para o diretório dentro do servidor.

Screenshot 2022-02-17 at 215648

Você poderia me ajudar a localizar onde estou errando?

Segue meu codigo:

using System.IO;
using System.Net;

var vFTP        = Convert.ToString(Variables["vEndereco"].Value);       // --> Endereco FTP
var vPasta      = Convert.ToString(Variables["vPasta"].Value);          // --> Diretorio do FTP 
var vUser       = Convert.ToString(Variables["vUsuario"].Value);        // --> Usuario do FTP
var vPass       = Convert.ToString(Variables["vSenha"].Value);          // --> Senha do FTP

var ftppath       = Convert.ToString(Variables["vLinkVisualizacao"].Value);
var NomeArquivo   = Convert.ToString(Variables["vNomeDoArquivo"].Value);

var PathServidor        = Convert.ToString(Variables["vPastaDownload"].Value);
var PathFullServidor    =  PathServidor + "/" + NomeArquivo;

string ftpfullpath = ftppath + "/" + NomeArquivo;

string outputfilepath = Path.Combine(PathFullServidor); //"C:/inetpub/wwwroot/notas/29109001.pdf"

Directory.CreateDirectory(Path.GetDirectoryName(outputfilepath));

string outputUrl = ftpfullpath;

try
{
   using (WebClient request = new WebClient())
   {
       // Passa usuário e senha do FTP.
       request.Credentials = new NetworkCredential(vUser, vPass);
       
       // Faz download do arquivo
       request.DownloadFile(ftpfullpath, outputfilepath);
   }
}
catch (Exception ex)
{
   throw new InvalidOperationException(ex.Message + "\t" + ex.InnerException?.Message);
}

// Preenche a variável do Formulário com a URL do arquivo para download
Variables["outputUrl"].Value = outputUrl;

Bom dia @Framos
Essa imagem que você mandou é do diretório para onde você está baixando os arquivos ou é do FTP?

@Framos estava dando uma pesquisada sobre o problema e encontrei este tópico:

Você pode tentar essa abordagem:

using (WebClient request = new WebClient())
{
   // Passa usuário e senha do FTP.
   request.Credentials = new NetworkCredential(vUser, vPass);

   request.DownloadDataCompleted += (sender, eventArgs) =>
   {
       byte[] fileData = eventArgs.Result;
       using (FileStream fileStream = new FileStream(outputfilepath, FileMode.Create))
           fileStream.Write(fileData, 0, fileData.Length);
   };
    
    // Faz download do arquivo
    request.DownloadData(ftpfullpath);
}

bom dia @daniel.giacomelli tudo bem?

Conseguir resolver o problema utilizando o código abaixo, agora esta tudo OK :grinning:

Obrigado por me ajudar :facepunch:

using System.IO;
using System.Net;

var ftphost = Convert.ToString(Variables["vEndereco"].Value);           // Endereço do FTP
var ftpfilepath = Convert.ToString(Variables["vPasta"].Value);          // Diretório do arquivo dentro do FTP
var ftpfullpath = "ftp://" + ftphost + ftpfilepath;                     // FTP + Diretório 
var ftpUser = Convert.ToString(Variables["vUsuario"].Value);            // Usuário do FTP
var ftpPassword = Convert.ToString(Variables["vSenha"].Value);          // Senha do FTP

var FileName = Convert.ToString(Variables["vNomeDoArquivo"].Value);         // Nome do arquivo que quero baixar
var PathFullServidor = ftpfullpath + "/" + FileName;                        // FTP + Diretório + nome do arquivo
var PathDonwload = Convert.ToString(Variables["vPastaDownload"].Value);     // Diretório no servidor onde será salvo o arquivo
var outputfilepath = PathDonwload + "/" + FileName;                         // Caminho onde o arquivo será baixado + nome do arquivo
var PathViwer = Convert.ToString(Variables["vLinkVisualizacao"].Value);     // URL para baixar o arquivo pelo LATROMI
var LinkViwer = PathViwer + "/" + FileName;                                 // Link utilizado para Visualizar o arquivo

Directory.CreateDirectory(Path.GetDirectoryName(outputfilepath));           // Cria a pasta "FTP_Downloads"
                                                                                                                                                 
try
{
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri(PathFullServidor));
    request.Method = WebRequestMethods.Ftp.DownloadFile;
    request.Credentials = new NetworkCredential(ftpUser, ftpPassword);
    request.UseBinary = true;
    using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
    {
        using (Stream rs = response.GetResponseStream())
        {
            using (FileStream ws = new FileStream(outputfilepath, FileMode.Create))
            {
                byte[] buffer = new byte[2048];
                int bytesRead = rs.Read(buffer, 0, buffer.Length);
                while (bytesRead > 0)
                {
                    ws.Write(buffer, 0, bytesRead);
                    bytesRead = rs.Read(buffer, 0, buffer.Length);
                }
            }
        }
    }
}
catch
{
    throw;
}    

Variables["outputUrl"].Value = LinkViwer;                                   // Linl completo para visualizar o arquivo
1 curtida