【n8n教程】FTP/SFTP节点,实现文件自动化传输

在日常工作中,我们经常需要与远程服务器交互,下载报告、备份文件、上传数据。手动完成这些任务既耗时又容易出错。n8n的FTP/SFTP节点可以帮你自动化所有这些操作!

无论是定时备份日志同步多个服务器的文件,还是自动化数据传输流程,FTP/SFTP节点都能轻松搞定。这篇教程将从零开始,带你逐步掌握n8n FTP/SFTP节点的核心操作。

n8n FTP工作流基本流程
n8n FTP工作流基本流程

🎯 你将学到什么


📚 第一章:理解FTP和SFTP

什么是FTP和SFTP?

**FTP(File Transfer Protocol)**是一种古老但仍然广泛使用的文件传输协议。它就像是一个"邮递员",帮你在本地电脑和远程服务器之间运送文件。

**SFTP(SSH File Transfer Protocol)**则是FTP的现代、安全版本。它使用SSH加密,确保你的文件在传输过程中不会被拦截或篡改。

FTP vs SFTP:一目了然

特性FTPSFTP
加密❌ 无加密✅ SSH加密
安全性
端口2122
认证用户名/密码密码/密钥
推荐场景内网/非敏感数据⭐ 生产环境(推荐使用)

结论:如果你的服务器支持SFTP,强烈推荐使用SFTP!它更安全,配置也更简单。


🔐 第二章:配置FTP/SFTP凭证

在n8n中添加FTP凭证

  1. 1. 打开你的n8n工作流
  2. 2. 点击左侧菜单的 "Credentials"
  3. 3. 选择 "Create New Credential"
  4. 4. 搜索 "FTP"

SFTP凭证配置(推荐)

填写以下信息:


    
    
    
  Host: 你的服务器地址 (例如: ftp.example.com)
Port: 22 (SFTP默认端口)
Username: 你的用户名
Password: 你的密码
Private Key (可选): 如果使用密钥认证
Passphrase (可选): 如果密钥有密码保护

FTP凭证配置


    
    
    
  Host: 你的服务器地址
Port: 21 (FTP默认端口)
Username: 你的用户名
Password: 你的密码

小贴士:建议在凭证名称中包含目标服务器信息,如 "MyServer-SFTP",便于日后维护。


🚀 第三章:FTP节点的5大核心操作

操作1️⃣:List(列表)- 查看文件夹内容

场景:检查FTP服务器上是否有新文件到达

配置步骤

  1. 1. 添加 FTP 节点
  2. 2. 选择 Operation: List
  3. 3. 输入 Path: /uploads (远程文件夹路径)
  4. 4. 勾选 Recursive: 是否递归扫描子文件夹

输出示例


    
    
    
  {
  "name"
: "report.pdf",
  "size"
: 1024,
  "modifyTime"
: "2025-01-15",
  "type"
: "file"
}

操作2️⃣:Download(下载)- 获取远程文件

场景:从FTP服务器下载日志文件进行处理

配置步骤

  1. 1. 选择 Operation: Download
  2. 2. 输入 Path: /logs/app.log (完整的文件路径)
  3. 3. 输入 Put Output File in Field: file_data (输出字段名)

关键点


操作3️⃣:Upload(上传)- 发送文件到服务器

场景:自动上传备份文件到远程服务器

配置步骤

  1. 1. 选择 Operation: Upload
  2. 2. 输入 Path: /backups/backup_2025_01_15.zip (远程保存路径)
  3. 3. 选择 Binary File: 打开
  4. 4. 输入 Input Binary Field: file_data (来自前一个节点)

常见用法


    
    
    
  前一节点输出 → 创建压缩文件 → FTP上传 → 远程备份完成

操作4️⃣:Rename(重命名)- 移动或重命名文件

场景:处理完文件后重命名,标记为"已处理"

配置步骤

  1. 1. 选择 Operation: Rename
  2. 2. 输入 Old Path: /uploads/report.pdf
  3. 3. 输入 New Path: /processed/report_done.pdf
  4. 4. 可选:勾选 Create Directories 自动创建目标文件夹

操作5️⃣:Delete(删除)- 清理文件或文件夹

场景:删除已处理的临时文件,保持服务器整洁

配置步骤

  1. 1. 选择 Operation: Delete
  2. 2. 输入 Path: /temp/old_file.txt
  3. 3. 可选:勾选 Folder 删除文件夹
  4. 4. 可选:勾选 Recursive 删除文件夹及其所有内容

⚠️ 谨慎使用:删除操作不可逆,请确保路径正确!


💡 第四章:实战案例 - 构建自动备份工作流

案例需求

每天凌晨2点,自动从服务器A的 /data 文件夹下载所有CSV文件,然后上传到服务器B的 /backups 文件夹

工作流设计


    
    
    
  定时触发器(每天2点) 
  ↓
FTP-List(服务器A, 列表/data下的文件)
  ↓
过滤(只选择*.csv文件)
  ↓
Loop(对每个文件循环)
  ↓
FTP-Download(服务器A, 下载文件)
  ↓
FTP-Upload(服务器B, 上传文件)
  ↓
发送通知(完成提醒)

完整工作流JSON代码


    
    
    
  {
  "nodes"
: [
    {

      "parameters"
: {
        "expression"
: "0 2 * * *",
        "timezone"
: "Asia/Shanghai"
      }
,
      "id"
: "Schedule",
      "name"
: "Schedule - 2AM Daily",
      "type"
: "n8n-nodes-base.cronTrigger",
      "typeVersion"
: 1,
      "position"
: [250, 300]
    }
,
    {

      "parameters"
: {
        "path"
: "/data",
        "recursive"
: true
      }
,
      "credentials"
: {
        "ftpCredential"
: "Server-A-SFTP"
      }
,
      "id"
: "ftp-list",
      "name"
: "FTP List - Server A",
      "type"
: "n8n-nodes-base.ftp",
      "typeVersion"
: 2,
      "position"
: [450, 300]
    }
,
    {

      "parameters"
: {
        "conditions"
: {
          "string"
: [
            {

              "value1"
: "={{$json.name}}",
              "value2"
: ".csv",
              "operation"
: "endsWith"
            }

          ]

        }

      }
,
      "id"
: "filter-csv",
      "name"
: "Filter - CSV Files Only",
      "type"
: "n8n-nodes-base.if",
      "typeVersion"
: 1,
      "position"
: [650, 300]
    }
,
    {

      "parameters"
: {
        "operation"
: "download",
        "path"
: "={{'/data/' + $json.name}}",
        "outputField"
: "file_content"
      }
,
      "credentials"
: {
        "ftpCredential"
: "Server-A-SFTP"
      }
,
      "id"
: "ftp-download",
      "name"
: "FTP Download - Server A",
      "type"
: "n8n-nodes-base.ftp",
      "typeVersion"
: 2,
      "position"
: [850, 300]
    }
,
    {

      "parameters"
: {
        "operation"
: "upload",
        "path"
: "={{'/backups/backup_' + $now.toFormat('yyyy-MM-dd') + '_' + $json.name}}",
        "binaryData"
: true,
        "inputDataFieldName"
: "file_content"
      }
,
      "credentials"
: {
        "ftpCredential"
: "Server-B-SFTP"
      }
,
      "id"
: "ftp-upload",
      "name"
: "FTP Upload - Server B",
      "type"
: "n8n-nodes-base.ftp",
      "typeVersion"
: 2,
      "position"
: [1050, 300]
    }
,
    {

      "parameters"
: {
        "subject"
: "✅ 文件备份完成",
        "message"
: "已成功备份{{$json.name}}到服务器B"
      }
,
      "id"
: "notify",
      "name"
: "Send Notification",
      "type"
: "n8n-nodes-base.emailSend",
      "typeVersion"
: 1,
      "position"
: [1250, 300]
    }

  ]
,
  "connections"
: {
    "Schedule"
: {
      "main"
: [
        [

          {

            "node"
: "ftp-list",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }
,
    "ftp-list"
: {
      "main"
: [
        [

          {

            "node"
: "filter-csv",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }
,
    "filter-csv"
: {
      "main"
: [
        [

          {

            "node"
: "ftp-download",
            "type"
: "main",
            "index"
: 0
          }

        ]
,
        [
]
      ]

    }
,
    "ftp-download"
: {
      "main"
: [
        [

          {

            "node"
: "ftp-upload",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }
,
    "ftp-upload"
: {
      "main"
: [
        [

          {

            "node"
: "notify",
            "type"
: "main",
            "index"
: 0
          }

        ]

      ]

    }

  }

}

🎓 第五章:常见问题解决

❌ 问题1:连接失败 "Connection Refused"

原因

解决方案


    
    
    
  1. 检查Host和Port是否正确
2. 用SSH客户端测试连接: ssh user@host
3. 检查防火墙是否允许该端口
4. 确认SFTP服务已启动

❌ 问题2:认证失败 "Authentication Failed"

原因

解决方案


    
    
    
  1. 确认用户名和密码
2. 如使用密钥,转换为OpenSSH格式:
   ssh-keygen -p -N "" -m pem -f your_key
3. 检查是否需要Passphrase

❌ 问题3:文件路径找不到

原因

解决方案


    
    
    
  1. 先用List操作查看实际路径
2. 确保路径格式: /folder/file.txt
3. 检查文件权限

❌ 问题4:下载大文件失败

原因

解决方案


    
    
    
  1. 分段下载较大文件
2. 增加超时设置
3. 检查网络连接稳定性

📊 实战技巧

✨ 技巧1:使用执行次数限制避免死循环

在使用List后连接Download时,添加 "Execute Once" 选项防止无限循环:


    
    
    
  FTP-List → [Execute Once: Only on first iteration] → FTP-Download

✨ 技巧2:文件名使用变量


    
    
    
  // 为上传的文件添加时间戳
路径: /backups/backup_{{ $now.toFormat('yyyy-MM-dd_HH:mm') }}_file.csv

// 使用循环中的文件名

路径: /archive/{{ $json.name }}

✨ 技巧3:错误处理


    
    
    
  // 添加Try-Catch节点处理下载失败
1.
 FTP-Download
2.
 IF判断是否成功
3.
 失败分支: 发送告警

🎯 总结

通过本教程,你已经掌握了:


引用链接

[1] 官方文档: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.ftp/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#