FTP_DOWNLOAD - Baixar Arquivo do Servidor FTP
O que é este Node?
O FTP_DOWNLOAD é o node responsável por baixar arquivos de um servidor FTP remoto para o sistema local. Permite recuperar arquivos armazenados em servidores FTP externos.
Por que este Node existe?
Buscar arquivos de servidores remotos é essencial para integrações e automações. O FTP_DOWNLOAD existe para:
- Processar Arquivos de Parceiros: Baixar pedidos, notas fiscais e documentos enviados por fornecedores via FTP
- Sincronizar Dados: Buscar arquivos atualizados de sistemas externos para processar localmente
- Recuperar Backups: Baixar backups armazenados em servidores FTP para restauração
- Integração B2B: Receber arquivos de parceiros que disponibilizam via FTP
Como funciona internamente?
Quando o FTP_DOWNLOAD é executado, o sistema:
- Conecta ao FTP: Estabelece conexão com servidor usando credenciais fornecidas
- Valida Arquivo Remoto: Verifica existência do arquivo no caminho remoto especificado
- Cria Diretório Local: Se necessário, cria diretórios locais para salvar o arquivo
- Baixa Arquivo: Transfere bytes do servidor remoto para arquivo local
- Registra Tamanho: Captura tamanho do arquivo baixado para confirmação
- Se falhar: Retorna erro detalhando problema (arquivo não encontrado, sem permissão, etc)
- Se sucesso: Confirma download com timestamp e detalhes do arquivo
Código interno (ftp-executor.service.ts:306-327):
private async downloadFile(client: FTP.Client, data: FTPNodeData): Promise<any> {
const remotePath = data.remoteFilePathDownload!;
const localPath = data.localFilePathDownload!;
// Ensure local directory exists
const localDir = path.dirname(localPath);
if (!fs.existsSync(localDir)) {
fs.mkdirSync(localDir, { recursive: true });
}
this.logger.debug(`Downloading file: ${remotePath} → ${localPath}`);
await client.downloadTo(localPath, remotePath);
return {
success: true,
remotePath,
localPath,
size: fs.statSync(localPath).size,
downloadedAt: new Date().toISOString()
};
}
Quando você DEVE usar este Node?
Use FTP_DOWNLOAD sempre que precisar de buscar arquivos de servidor FTP remoto:
Casos de uso
- Processar Pedidos: "Baixar arquivo CSV de pedidos do servidor FTP do fornecedor todas as manhãs às 8h"
- Importar Dados: "Baixar planilha Excel atualizada do servidor do cliente para importar produtos"
- Recuperar Documentos: "Baixar notas fiscais XML disponibilizadas pelo contador via FTP"
Quando NÃO usar FTP_DOWNLOAD
- APIs Disponíveis: Use endpoints REST se a aplicação oferecer API moderna
- Cloud Storage: Use nodes S3, Google Drive ou Dropbox para buscar de cloud
- Transferências Seguras: Use SFTP_DOWNLOAD para dados sensíveis (mais seguro)
Parâmetros Detalhados
remoteFilePathDownload (string, obrigatório)
O que é: Caminho completo do arquivo no servidor FTP remoto que será baixado.
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste FTP Download - RemotePath",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Definir Arquivo Remoto",
"parameters": {
"variableName": "remote_file",
"value": "/exports/pedidos_2025-01-15.csv"
}
}
},
{
"id": "ftp_1",
"type": "ftp",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Download Arquivo",
"parameters": {
"host": "ftp.fornecedor.com",
"username": "empresa",
"password": "pass123",
"operation": "download",
"remoteFilePathDownload": "{{remote_file}}",
"localFilePathDownload": "/tmp/pedidos.csv",
"outputVariable": "download_result"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Arquivo baixado: {{download_result.size}} bytes"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "ftp_1" },
{ "source": "ftp_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: O arquivo deve existir no servidor remoto no caminho especificado.
localFilePathDownload (string, obrigatório)
O que é: Caminho completo onde o arquivo será salvo no sistema local.
Padrão: Nenhum (obrigatório)
Flow completo para testar:
{
"name": "Teste FTP Download - LocalPath",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Pedir Caminho Local",
"parameters": {
"message": "Onde salvar? (Ex: /tmp/arquivo.pdf)",
"variableName": "local_path"
}
}
},
{
"id": "ftp_1",
"type": "ftp",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Download com Path Dinâmico",
"parameters": {
"host": "ftp.servidor.com",
"username": "user",
"password": "pass",
"operation": "download",
"remoteFilePathDownload": "/docs/manual.pdf",
"localFilePathDownload": "{{local_path}}"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Arquivo salvo em: {{local_path}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "ftp_1" },
{ "source": "ftp_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Digite "/tmp/manual.pdf". Sistema baixará e salvará neste caminho.
outputVariable (string, opcional)
O que é: Nome da variável onde resultado do download será armazenado.
Padrão: "ftp_result"
Flow completo para testar:
{
"name": "Teste FTP Download - OutputVariable",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "ftp_1",
"type": "ftp",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Download com Variável Customizada",
"parameters": {
"host": "ftp.backup.com",
"username": "backup",
"password": "pass",
"operation": "download",
"remoteFilePathDownload": "/backups/database.sql",
"localFilePathDownload": "/tmp/restore.sql",
"outputVariable": "download_info"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Detalhes",
"parameters": {
"message": "Download concluído!\nArquivo: {{download_info.localPath}}\nTamanho: {{download_info.size}} bytes\nHora: {{download_info.downloadedAt}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "ftp_1" },
{ "source": "ftp_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Resultado fica disponível em {{download_info}} para usar em nodes posteriores.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| host | string | Sim | Endereço do servidor FTP |
| port | number | Não | Porta TCP (padrão: 21) |
| username | string | Sim | Nome de usuário |
| password | string | Sim | Senha |
| secure | boolean | Não | FTPS - SSL/TLS (padrão: false) |
| operation | string | Sim | Deve ser "download" |
| remoteFilePathDownload | string | Sim | Caminho do arquivo no servidor remoto |
| localFilePathDownload | string | Sim | Caminho onde salvar localmente |
| outputVariable | string | Não | Variável de resultado (padrão: ftp_result) |
Exemplo 1: Download Diário de Arquivo CSV de Pedidos
Objetivo: Baixar automaticamente arquivo de pedidos todas as manhãs às 8h
JSON para Importar
{
"name": "Download Automático Pedidos",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início (8h diariamente)" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Data de Hoje",
"parameters": {
"variableName": "hoje",
"value": "2025-01-15"
}
}
},
{
"id": "ftp_1",
"type": "ftp",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Baixar Pedidos",
"parameters": {
"host": "ftp.fornecedor.com",
"port": 21,
"username": "empresa_pedidos",
"password": "secret123",
"secure": false,
"operation": "download",
"remoteFilePathDownload": "/exports/pedidos_{{hoje}}.csv",
"localFilePathDownload": "/var/imports/pedidos_{{hoje}}.csv",
"outputVariable": "pedidos_info"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Notificar",
"parameters": {
"message": "✅ Pedidos baixados!\nArquivo: pedidos_{{hoje}}.csv\nTamanho: {{pedidos_info.size}} bytes\nPronto para processar!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "ftp_1" },
{ "source": "ftp_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: ✅ Pedidos baixados!
Arquivo: pedidos_2025-01-15.csv
Tamanho: 1048576 bytes
Pronto para processar!
Exemplo 2: Download com Verificação de Múltiplos Arquivos
Objetivo: Baixar vários arquivos do servidor FTP e confirmar cada um
JSON para Importar
{
"name": "Download Múltiplos Arquivos",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "ftp_1",
"type": "ftp",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Baixar Arquivo 1",
"parameters": {
"host": "ftp.docs.com",
"username": "download_user",
"password": "pass123",
"operation": "download",
"remoteFilePathDownload": "/invoices/nf_001.xml",
"localFilePathDownload": "/tmp/nf_001.xml",
"outputVariable": "nf1"
}
}
},
{
"id": "ftp_2",
"type": "ftp",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Baixar Arquivo 2",
"parameters": {
"host": "ftp.docs.com",
"username": "download_user",
"password": "pass123",
"operation": "download",
"remoteFilePathDownload": "/invoices/nf_002.xml",
"localFilePathDownload": "/tmp/nf_002.xml",
"outputVariable": "nf2"
}
}
},
{
"id": "ftp_3",
"type": "ftp",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Baixar Arquivo 3",
"parameters": {
"host": "ftp.docs.com",
"username": "download_user",
"password": "pass123",
"operation": "download",
"remoteFilePathDownload": "/invoices/nf_003.xml",
"localFilePathDownload": "/tmp/nf_003.xml",
"outputVariable": "nf3"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Resumo",
"parameters": {
"message": "📥 3 notas fiscais baixadas:\n✅ {{nf1.localPath}}\n✅ {{nf2.localPath}}\n✅ {{nf3.localPath}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "ftp_1" },
{ "source": "ftp_1", "target": "ftp_2" },
{ "source": "ftp_2", "target": "ftp_3" },
{ "source": "ftp_3", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: 📥 3 notas fiscais baixadas:
✅ /tmp/nf_001.xml
✅ /tmp/nf_002.xml
✅ /tmp/nf_003.xml
Exemplo 3: Download Seguro com FTPS
Objetivo: Baixar backup de forma segura usando FTPS (FTP com SSL/TLS)
JSON para Importar
{
"name": "Download Seguro Backup",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Iniciar Download",
"parameters": {
"message": "🔄 Iniciando download seguro do backup..."
}
}
},
{
"id": "ftp_1",
"type": "ftp",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Download FTPS Seguro",
"parameters": {
"host": "ftps.backup.com",
"port": 990,
"username": "backup_admin",
"password": "SuperSecure@123",
"secure": true,
"operation": "download",
"remoteFilePathDownload": "/backups/database_2025-01-15.sql.gz",
"localFilePathDownload": "/var/backups/database_restore.sql.gz",
"outputVariable": "backup_info"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar Sucesso",
"parameters": {
"message": "✅ Backup baixado com segurança!\nArquivo: {{backup_info.localPath}}\nTamanho: {{backup_info.size}} bytes\nCriptografia: SSL/TLS ativa"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "ftp_1" },
{ "source": "ftp_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: 🔄 Iniciando download seguro do backup...
Sistema: ✅ Backup baixado com segurança!
Arquivo: /var/backups/database_restore.sql.gz
Tamanho: 52428800 bytes
Criptografia: SSL/TLS ativa
Resposta do Node
{
"success": true,
"data": {
"ftp_result": {
"success": true,
"remotePath": "/exports/pedidos.csv",
"localPath": "/tmp/pedidos.csv",
"size": 1048576,
"downloadedAt": "2025-01-15T08:00:00.000Z"
},
"operation": "download",
"host": "ftp.fornecedor.com",
"timestamp": "2025-01-15T08:00:00.000Z"
},
"executionTime": 3456,
"logs": [
"Downloaded file: /exports/pedidos.csv → /tmp/pedidos.csv"
]
}
Boas Práticas
✅ SIM:
- Crie diretórios locais antes do download (o sistema faz automaticamente)
- Use caminhos absolutos para evitar problemas de localização
- Baixe para /tmp/ se arquivo for temporário, use /var/ para permanentes
- Configure timeout adequado para arquivos grandes
- Use FTPS (secure: true) para download de dados sensíveis
❌ NÃO:
- Não tente baixar arquivos que não existem no servidor
- Não sobrescreva arquivos importantes sem fazer backup primeiro
- Não assuma que download sempre será rápido (depende do tamanho)
- Não ignore erros de download - sempre trate falhas
- Não baixe para diretórios sem permissão de escrita
Dicas
💡 Dica 1: Velocidade do download depende da sua conexão. Arquivo de 100MB pode levar minutos.
💡 Dica 2: Se download falhar, verifique: (1) arquivo existe no servidor, (2) você tem permissão de leitura, (3) espaço em disco local disponível.
💡 Dica 3: Para baixar múltiplos arquivos, use FTP_LIST primeiro para obter lista, depois LOOP para baixar cada um.
💡 Dica 4: Diretórios locais são criados automaticamente se não existirem. Ex: /var/imports/2025/01/ será criado se necessário.
Próximos Nodes
→ FTP_UPLOAD - Enviar arquivo para servidor FTP → FTP_LIST - Listar arquivos disponíveis antes de baixar → FTP_DELETE - Apagar arquivo remoto após baixar → SFTP_DOWNLOAD - Baixar via SFTP (mais seguro)