翔宇工作流
  • 首页
  • 分类
    • Make教程
    • n8n教程
    • 自媒体
    • 跨境电商
    • Youtube
    • AI教程与资料
    • 提示词
    • 免费
    • 微信公众号
    • 小红书
    • RSS
    • DeepSeek
    • SEO
    • 口播稿
  • AI自动化赚钱
  • AI自动化工作流
  • 工作流教程
    • Make中文教程
    • n8n中文教程
  • 国内小报童
  • 国际BMC
  • Youtube
Make中文教程:自动化基础
https://youtu.be/RxEZLCvd24M?si=iHd7zW-UhgxdYAop
小红书自动化:如何利用Make制作个人自媒体中心,批量生成爆款笔记
https://youtu.be/e4cHFKmOGQQ?si=EpXr4CIoGmqvnUV9
微信公众号图文混排文章自动化实战:利用Make 批量制作
https://youtu.be/cqK9hYF8jPk?si=SorVpXyW34rJUIgL
翔宇工作流
6K
121
0
翔宇工作流
  • 首页
  • 分类
    • Make教程
    • n8n教程
    • 自媒体
    • 跨境电商
    • Youtube
    • AI教程与资料
    • 提示词
    • 免费
    • 微信公众号
    • 小红书
    • RSS
    • DeepSeek
    • SEO
    • 口播稿
  • AI自动化赚钱
  • AI自动化工作流
  • 工作流教程
    • Make中文教程
    • n8n中文教程
  • 国内小报童
  • 国际BMC
  • Youtube
  • n8n中文教程

n8n 中文教程:压缩 (Compression)、编辑图像 (Edit Image)、FTP (FTP)、n8n 表单 (n8n Form)

  • 翔宇工作流
  • 2025年5月5日
Total
0
Shares
0
0
翔宇Make-n8n教程
目录 隐藏
1 引言
2 压缩节点 (Compression)
3 编辑图像节点 (Edit Image)
4 FTP 节点 (FTP)
5 n8n 表单节点 (n8n Form)
6 结尾

引言

大家好,我是翔宇。欢迎来到“翔宇工作流”。很多朋友问我,没有编程基础能不能玩转自动化?答案是肯定的!n8n 就是这样一款强大的工具,它用可视化的方式让你连接各种应用,搭建属于自己的自动化流程,极大地提升效率。

n8n 的核心在于它的节点 (Nodes) 。你可以把它们想象成一个个功能各异的乐高积木。比如,有的积木负责发送邮件,有的负责读取文件,有的负责处理数据。将这些节点按照你的需求连接起来,就能创造出各种各样强大的自动化工作流,让机器为你完成那些重复、繁琐的任务。无论是处理日常工作,还是实现一些酷炫的创意,n8n 都能帮你轻松搞定。

为何关注这四个核心节点?

n8n 的节点库非常丰富,包含了数百个连接不同应用和服务的节点 。对于新手来说,可能有点眼花缭乱。所以这次教程,翔宇特别挑选了四个非常实用且常用的核心节点,带大家深入了解:压缩 (Compression)、编辑图像 (Edit Image)、FTP 和 n8n 表单 (n8n Form)。

  • 压缩节点 (Compression): 在数字世界里,文件传来传去是常态。这个节点能帮你轻松搞定文件的压缩和解压 。比如,你需要把一堆报告打包发给同事,或者收到一个压缩包需要自动解开处理里面的文件,它就能大显身手,既节省存储空间,也方便传输。
  • 编辑图像节点 (Edit Image): 图片处理也是个常见需求。这个节点让你可以在工作流中直接编辑图片,比如调整大小、裁剪、添加水印文字等等 。想象一下,自动给你的产品图加上 Logo,或者批量生成带标题的社交媒体图片,是不是很酷?再也不用手动打开 P 图软件了。
  • FTP 节点 (FTP): 虽然云存储很流行,但很多时候我们还是需要和传统的 FTP 或 SFTP 服务器打交道 。这个节点就是你连接这些服务器的桥梁,可以实现文件的自动上传、下载、删除、重命名等操作,对于处理服务器上的文件非常方便。
  • n8n 表单节点 (n8n Form): 自动化流程有时也需要人的参与。n8n 表单节点(包括它的触发器版本 n8n Form Trigger)就是用来创建交互式网页表单的 。你可以用它来收集用户输入的信息,或者让用户在流程中做出选择和确认。这让你的自动化流程不再是“一头闷”,而是可以和人进行互动。

翔宇认为,掌握了这四个节点,你就掌握了处理文件、图像和用户交互的关键能力,能够解决许多常见的自动化需求,也为将来学习更复杂的 n8n 工作流打下了坚实的基础。

教程结构与阅读建议

为了让大家循序渐进地掌握这些节点,本教程会按照以下结构进行:

  1. 逐一讲解: 分别为 Compression, Edit Image, FTP, n8n Form 四个节点设立专门的章节。
  2. 章节内部结构:
    • 概览: 快速了解节点是做什么的,有什么价值。
    • 参数配置 (翔宇实战理解): 详细解释每个配置选项的含义和用法,并结合翔宇的实际使用经验,告诉你一些需要注意的细节。
    • 数据映射与表达式技巧: 如何利用 n8n 的表达式动态配置节点,处理复杂的数据流。
    • 翔宇常用应用场景: 给出一些翔宇在实际工作中常用的案例,启发你的思路。
    • 常见报错及解决方案: 总结新手容易遇到的问题和解决方法,让你少走弯路。
    • 注意事项: 提醒一些重要的前提条件、最佳实践和潜在风险。

给零基础朋友的建议:

  • 按顺序阅读: 建议从第一个节点开始,按顺序学习。
  • 动手实践: 理论结合实践是最好的学习方式。打开你的 n8n,跟着教程一步步操作,尝试运行每一个示例。
  • 不怕犯错: 遇到报错是正常的。仔细阅读报错信息,对照教程里的“常见报错及解决方案”部分进行排查。n8n 的调试功能也很强大,善用它来观察数据流向。
  • 参考官方文档和社区: 本教程参考了官方文档和社区讨论 。如果你想了解更深入的信息,可以查阅这些资源。

准备好了吗?让我们一起进入 n8n 的自动化世界,用这四个强大的节点,开启你的高效工作之旅!

压缩节点 (Compression)

概览 (Overview)

节点作用:

压缩 (Compression) 节点的核心功能,就是在你的 n8n 工作流中,对文件执行压缩或者解压缩的操作 3。简单来说,它能帮你把一个或多个文件打包成一个压缩文件,也能把一个压缩文件解开,还原成里面的原始文件。

想象几个场景:

  • 你运行了一个工作流,生成了很多份报告文件,你想把它们打包成一个 .zip 文件,方便通过邮件发送。
  • 你从某个地方下载了一个 .zip 或 .gz 格式的压缩包,里面是你需要处理的数据文件,你想让 n8n 自动解压它,然后对里面的文件进行下一步操作。
  • 你需要定期备份一些文件,压缩后再存储可以节省空间。

这些情况下,压缩节点就能派上大用场。

支持格式:

根据官方文档,这个节点主要支持两种常见的压缩格式:Zip 和 Gzip (.gz) 3。

  • Zip: 这是我们最常用的格式,可以包含多个文件和文件夹,并且能保留目录结构。
  • Gzip: 通常用于压缩单个文件,在 Linux/Unix 世界里很常见。

需要注意的是,虽然大家平时可能还会接触到 RAR, 7z 等其他压缩格式,但 n8n 内建的这个压缩节点目前主要支持 Zip 和 Gzip 。如果你需要处理其他格式,可能需要寻找社区节点或者使用 Execute Command 节点调用外部命令来完成。

核心价值:

  • 自动化: 将手动压缩解压文件的繁琐操作自动化,融入到你的工作流中。
  • 效率提升: 批量处理文件压缩解压,节省时间和人力。
  • 资源节省: 压缩文件可以显著减少存储空间的占用,也能在网络传输时节省带宽。
  • 方便归档与传输: 将多个相关文件打包成一个文件,便于管理、备份和分享。

翔宇视角:

这个节点看起来功能单一,但在实际应用中非常灵活。翔宇经常在需要处理批量文件、进行数据备份、或者分发报告的工作流中使用它。特别是当一个工作流产生了多个输出文件(比如多个报表、多张图片),而你又需要把这些结果整合在一起发送或保存时,用压缩节点打包一下就非常方便 10。它能让你的工作流输出更加规整,也让后续的文件处理步骤更简单。

参数配置

配置压缩节点非常直观,主要就是选择操作模式,然后告诉它要处理哪个文件,以及输出结果放在哪里。

操作 (Operation):

这是你首先要选择的参数,决定这个节点是执行 压缩 (Compress) 任务还是 解压 (Decompress) 任务 3。

压缩 (Compress) 模式详解:

当你选择“压缩”时,你需要配置以下参数:

  • 输入二进制字段 (Input Binary Field(s)):
    • 作用: 这个参数是告诉压缩节点:“你要压缩的文件在哪里?”。在 n8n 中,文件内容通常是以一种叫做“二进制数据 (Binary Data)”的形式在节点之间传递的。你需要在这里填入包含这些二进制数据的字段的名称 (Key)。
    • 如何填写:
      • 单个文件: 如果前一个节点(比如 HTTP Request 下载节点,或者 Read Binary File 读取节点)的输出只有一个包含文件的二进制字段,假设这个字段名叫 data,那你就在这里填 data。
      • 多个文件 (来自同一 Item): 如果前一个节点的输出 Item 中包含了多个二进制字段,比如 file1, file2, report,你想把这几个文件都压缩到一个包里,你可以在这里用逗号把它们隔开,填入 file1,file2,report 。
      • 多个文件 (来自不同 Items): 这是一个常见且稍微复杂的情况。比如,你用一个节点循环下载了 3 个文件,产生了 3 个 Items,每个 Item 里都有一个名为 data 的二进制字段。如果你直接把这 3 个 Items 输入到压缩节点,并且这里只填 data,通常情况下(取决于节点设置)它可能只会压缩第一个 Item 的文件,或者生成 3 个单独的压缩包。要将来自不同 Items 的多个文件压缩到 同一个 压缩包里,通常需要一些预处理步骤。社区中有很多关于这个问题的讨论 。常用的方法是,在压缩节点之前,使用 Merge 节点(注意选择合适的合并模式,特别是对二进制数据的处理)或者 Code 节点,先把所有需要压缩的二进制数据聚合到 一个 Item 的不同二进制字段里,然后再把这个聚合后的 Item 输入到压缩节点。具体技巧我们稍后在“数据映射与表达式技巧”部分会详细讲。
    • 翔宇实战理解: 这个参数是压缩操作的核心,填错或者没理解 n8n 的数据结构,就很容易出错。关键在于,你要清楚地知道,包含你要压缩的文件内容的那个二进制数据,在前一个节点的输出里,它的字段名叫什么。你可以点击节点编辑界面上方的 “Input Data” 来查看上一个节点的输出结构,找到那个二进制字段(通常会显示文件名、MIME 类型等信息)。
  • 输出格式 (Output Format):
    • 作用: 选择你希望生成的压缩文件的格式。
    • 选项: Zip 或 Gzip 。
    • 翔宇建议: 一般情况下,选择 Zip 更为通用,因为它可以包含多个文件和文件夹结构。如果你确定只需要压缩单个文件,并且对接的系统或场景习惯使用 .gz 格式,那么可以选择 Gzip。
  • 文件名 (File Name):
    • 作用: 设置生成的压缩文件的名称。这个参数 仅在输出格式选择为 Zip 时 才可用 。
    • 如何填写: 输入你想要的文件名,比如 archive.zip 或者 monthly_reports.zip。
    • 动态命名: 这个字段支持 n8n 的表达式。你可以利用表达式根据当前日期、前置节点的数据等动态生成文件名,非常灵活。例如,填入 {{ $now.toFormat('yyyy-MM-dd') }}_backup.zip 就可以生成像 2023-10-27_backup.zip 这样的文件名。
  • 输出文件存放字段 (Put Output File in Field):
    • 作用: 压缩操作完成后,会生成一个新的包含压缩文件的二进制数据。这个参数就是让你给这个新的二进制数据起一个字段名 。
    • 如何填写: 输入一个你指定的字段名,比如 compressedFile 或者 zipOutput。
    • 后续使用: 工作流中后续的节点(比如 FTP 上传节点、或者发送邮件节点)就可以通过你在这里设置的字段名,来引用这个刚刚生成的压缩文件了。

解压 (Decompress) 模式详解:

当你选择“解压”时,你需要配置以下参数:

  • 输入二进制字段 (Input Binary Field(s)):
    • 作用: 和压缩模式类似,这里是告诉解压节点:“你要解压的那个压缩文件在哪里?” 。你需要填入包含压缩文件二进制数据的字段名。
    • 来源: 这个字段名同样来自前置节点的输出,比如从邮件附件读取到的 Zip 文件,或者从 FTP 下载的 Gzip 文件。
  • 输出文件名前缀 (Output Prefix):
    • 作用: 当压缩包被解开后,里面的文件(或文件夹)会被提取出来。这个参数允许你给所有提取出来的文件(或文件夹)的名称前面,统一添加一个前缀 。
    • 如何填写: 输入你想要的前缀,比如 extracted_ 或者 unzipped_。
    • 示例: 如果你的压缩包里有个文件叫 report.txt,你设置前缀为 extracted_,那么解压后得到的文件的二进制数据,其关联的文件名就会是 extracted_report.txt。
    • 翔宇实战理解: 这个前缀的主要作用是帮助区分和管理解压后的文件,尤其是在一个工作流中可能处理多个压缩包,或者解压后的文件名可能与工作流中其他文件重名时,添加前缀可以有效避免混淆和冲突。如果压缩包内包含多个文件,解压后通常会产生多个输出 Items,每个 Item 对应一个解压后的文件,这个前缀会对所有这些文件生效。

配置中的隐含逻辑:依赖上游数据

配置压缩节点本身并不复杂,但它的成功运行,高度依赖于它的上游节点是否正确地准备并输出了它所需要的二进制数据。这一点对于新手来说尤其重要。很多时候,压缩节点报错,问题根源并不在压缩节点自身的配置,而在于:

  • 上游的下载节点(如 HTTP Request)没有成功下载文件,导致没有二进制数据传过来。
  • 上游的读取节点(如 Read Binary File)配置错误,没有读到文件。
  • 你在压缩节点的 输入二进制字段 参数里填写的字段名,和上游节点实际输出的字段名不匹配(可能大小写错误,或者根本就没那个字段)。

所以,当压缩节点不工作时,除了检查它的配置,更要仔细检查传递给它的输入数据 (Input Data) 是否符合预期。理解这种节点间的依赖关系,是排查 n8n 工作流问题的关键。

数据映射与表达式技巧

n8n 的强大之处在于其灵活的数据处理能力,压缩节点也可以通过表达式实现更动态的配置。

动态文件名 (压缩模式):

前面提到,在压缩模式下,文件名 (File Name) 参数支持表达式。这让你可以创建更有意义的文件名。

  • 按日期命名:{{ $now.toFormat('yyyyMMdd_HHmmss') }}_archive.zip 会生成类似 20231027_153000_archive.zip 的文件名。$now 是 n8n 内置的表示当前时间的对象,toFormat 是格式化方法。
  • 根据输入数据命名: 假设前一个节点输出了一个包含订单信息的 JSON 对象,你可以这样命名:order_{{ $json.orderId }}_files.zip。这里 $json.orderId 就是引用了输入数据中名为 orderId 的字段值。

处理多个二进制文件 (压缩模式):

这是压缩节点使用中的一个常见挑战,关键在于如何将多个文件的数据正确地传递给 输入二进制字段 (Input Binary Field(s)) 参数。

  • 情况一:多个文件来自同一个 Item 的不同字段
    • 如果你的输入数据只有一个 Item,但这个 Item 的 binary 对象下有多个属性,分别代表不同的文件(例如,一个 HTTP Request 节点下载了多个文件,并设置了不同的输出字段名),比如输入 Item 的 binary 结构是: JSON{ "fileA": { "fileName": "report.pdf",... }, "fileB": { "fileName": "image.jpg",... } } ​
    • 那么你可以在 输入二进制字段 参数中,用逗号将这些字段名连接起来:fileA,fileB。这样,report.pdf 和 image.jpg 都会被压缩到同一个 Zip 包里。
  • 情况二:多个文件来自不同的 Items,且字段名相同
    • 这是更常见的情况。比如,你用 SplitInBatches 节点或者一个循环,处理了一个文件列表,每次迭代都下载或生成一个文件,放在名为 data 的二进制字段里。这样你就得到了多个 Items,每个 Item 的 binary.data 里都装着一个文件。
    • 直接连接的后果: 如果你直接将这些 Items 连接到压缩节点,并在 输入二进制字段 里填 data,结果可能不如预期:
      • 如果压缩节点的 “Execute Once” 设置是开启的(默认可能不是),它只会处理第一个 Item。
      • 如果 “Execute Once” 关闭,它可能会为每个输入的 Item 都生成一个单独的压缩包,而不是把所有文件压到一个包里。
    • 解决方案:聚合数据
      • 目标: 你需要先把所有这些 Items 中的 binary.data 收集起来,放到 一个 Item 里,然后再交给压缩节点处理。
      • 常用工具: Merge 节点或 Code 节点。
      • Merge 节点: 可以用 Merge 节点将多个 Items 合并。你需要选择合适的 Mode (合并模式),比如 Merge By Index 或 Merge By Key 可能不适用,Append 或 Combine 模式可能更相关,但要特别注意它如何处理 binary 数据。你需要实验并查看 Merge 节点的输出,确保所有二进制数据都保留下来并放在一个 Item 里(可能需要后续再用 Set 或 Function Item 节点整理)。
      • Code 节点 (翔宇推荐): Code 节点通常更灵活可控。你可以设置 Code 节点的模式为 Run Once for All Items (这样它就能一次性拿到所有输入的 Items)。然后在代码里遍历所有输入 Items,把它们的二进制数据提取出来,放到一个新的对象里,最后返回一个包含这个新对象的 Item。
        • 示例代码 (参考 S2, S20, S24): 假设每个输入 Item 的二进制数据都在 data 字段,并且你想保留原始文件名。 JavaScript// Code Node: 设置 Mode 为 Run Once for All Items const items = $input.all(); // 获取所有输入 Items const binariesToCompress = {}; // 创建一个空对象来存储所有二进制数据 let fileIndex = 0; for (const item of items) { // 检查当前 Item 是否有 binary 数据,并且 data 字段存在 if (item.binary && item.binary.data) { // 获取原始文件名,如果没有提供,则使用 'unknown' const originalFileName = item.binary.data.fileName | ​

| ‘unknown’;

// 创建一个唯一的 key,防止文件名冲突。例如: “file_0_report.txt”, “file_1_image.jpg”

// Object.keys($binary) 在后续压缩节点中可能需要这个结构

const uniqueKey = file_${fileIndex}_${originalFileName};

binariesToCompress[uniqueKey] = item.binary.data; // 将二进制数据存入对象

fileIndex++;

}

}

// 返回一个 Item,其 binary 属性包含了所有收集到的文件
            // json 属性可以为空,或者包含一些元数据
            return;
            ```
       后续压缩节点配置: 在这个 Code 节点之后连接压缩节点。压缩节点的 `输入二进制字段` 参数需要能够引用 Code 节点输出的所有二进制字段名。你可以使用表达式 `{{ Object.keys($input.item.binary).join(',') }}` 来动态获取所有字段名。`$input.item.binary` 指向 Code 节点输出的那个包含所有二进制数据的 `binary` 对象,`Object.keys()` 获取所有键(即我们生成的 `file_0_...`, `file_1_...`),`join(',')` 将它们用逗号连接成一个字符串。

处理解压输出:

当解压一个包含多个文件的压缩包时,压缩节点通常会输出多个 Items,每个 Item 对应一个解压后的文件。你需要注意后续节点如何处理这批 Items。如果你希望将所有解压后的文件合并处理(比如一起上传),可能也需要用到 Merge 或 Code 节点进行聚合。

数据结构转换的重要性

从处理多个文件的场景可以看出,n8n 节点之间的数据传递并非总是“即插即用”。压缩节点在处理多文件输入时,对数据的结构有特定的期望(比如期望多个二进制属性在单个 Item 中,或者能按特定方式处理多 Items)。如果输入数据的结构不匹配,就需要我们主动使用像 Merge 或 Code 这样的“瑞士军刀”节点来转换数据结构,使其满足下游节点的要求。这是 n8n 工作流构建中一个非常核心且常见的操作:理解数据流,并在必要时重塑它。

常用应用场景

掌握了基本配置和技巧后,我们来看看压缩节点在实际工作流中能做什么。

场景一:每日报告打包归档

  • 流程:
    1. Schedule Trigger: 设置一个每天凌晨触发的定时器。
    2. Database Node (e.g., PostgreSQL, MySQL): 查询数据库,获取需要生成报告的数据。
    3. Spreadsheet File Node (or similar): 将查询结果格式化并生成一个 Excel 或 CSV 文件(输出为二进制数据)。
    4. Compression Node:
      • Operation: Compress
      • Input Binary Field(s): 引用上一步生成的报告文件的二进制字段名。
      • Output Format: Zip
      • File Name (Expression):DailyReport_{{ $now.toFormat('yyyyMMdd') }}.zip
      • Put Output File in Field:reportZip
    5. FTP Node (or Google Drive, etc.):
      • Operation: Upload
      • Input Binary Field:reportZip (引用压缩节点输出的字段)
      • Path: 上传到指定的备份服务器路径。
  • 价值: 实现报告生成、打包、备份全自动化。

场景二:处理邮件附件压缩包

  • 流程:
    1. Email Trigger / Email Read IMAP Node: 监控邮箱,当收到带有特定主题或发件人的邮件时触发,并读取邮件附件。
    2. IF Node: 判断附件是否存在,并且文件名是否以 .zip 或 .gz 结尾。
    3. Compression Node (Branch for compressed files):
      • Operation: Decompress
      • Input Binary Field(s): 引用邮件节点输出的附件二进制字段名。
      • Output Prefix:mail_unzip_ (可选)
    4. 后续处理节点: 接收解压后的文件 (可能是多个 Items),根据文件类型进行不同处理,例如:
      • Read PDF Node / OCR: 如果是 PDF,读取内容或进行 OCR 识别。
      • Edit Image Node: 如果是图片,进行编辑。
      • Move Binary Data / Set Node: 处理文本文件内容。
      • Google Drive / Dropbox Node: 将文件存入云存储。
  • 价值: 自动化处理收到的压缩文件附件,无需手动下载解压。

场景三:批量下载网页图片并打包

  • 流程:
    1. Function Node / Spreadsheet File Node: 准备一个包含多个图片 URL 的列表。
    2. SplitInBatches Node / Loop: 遍历 URL 列表。
    3. HTTP Request Node (Inside loop):
      • URL: 引用当前迭代的图片 URL。
      • Options -> Response Format: Binary (确保下载的是图片文件本身,而不是 HTML 页面)。
      • Output: 输出一个名为 data (或其他你指定的名字) 的二进制字段。
    4. Code Node (After loop):
      • Mode: Run Once for All Items
      • Code: 使用前面示例中的聚合代码,将所有下载的图片二进制数据收集到一个 Item 的 binary 对象下。
    5. Compression Node:
      • Operation: Compress
      • Input Binary Field(s) (Expression):{{ Object.keys($input.item.binary).join(',') }}
      • Output Format: Zip
      • File Name:Downloaded_Images.zip
      • Put Output File in Field:imageArchive
    6. (Optional) HTTP Response Node / Form Ending Node: 提供下载链接给用户,或者将 imageArchive 发送到其他地方。
  • 价值: 自动化下载大量图片并打包,非常适合需要收集网络图片素材的场景 。

常见报错及解决方案

在使用压缩节点时,你可能会遇到一些问题。别担心,大部分问题都有解决方法。

错误:内存不足 (Out of Memory / Process finished with exit code 137)

  • 现象: 当你尝试压缩或解压非常大的文件,或者一次性处理成百上千个小文件时,n8n 可能会消耗掉所有可用的服务器内存,导致工作流执行失败,甚至 n8n 服务崩溃 。
  • 解决方案:
    • 调整 n8n 二进制数据处理模式 (推荐,需自托管权限): n8n 默认可能将二进制数据(文件内容)存储在内存中。你可以通过设置环境变量 N8N_DEFAULT_BINARY_DATA_MODE=filesystem 来告诉 n8n 将这些数据临时存储到磁盘上,从而大大减少内存占用 。这个环境变量需要在启动 n8n 时设置。如果你使用 Docker,可以在 docker-compose.yml 或 docker run 命令的 environment 部分添加 - N8N_DEFAULT_BINARY_DATA_MODE=filesystem。
    • 分批处理: 如果文件数量实在太大,可以考虑修改工作流逻辑,使用 SplitInBatches 等节点将任务分成多个较小的批次来处理,每次只压缩或解压一部分文件。
    • 使用 Execute Command 节点 (终极方案): 对于极端的、非常大的压缩/解压任务,可以考虑完全绕过 n8n 的内部处理。先用节点(如 HTTP Request, Read Binary File)将文件下载或读取到 n8n 服务器可以访问的临时目录,然后使用 Execute Command 节点调用操作系统的压缩命令(如 Linux/macOS 的 zip, gzip, unzip)来完成实际的压缩解压工作 。这样内存消耗主要由操作系统命令承担,而不是 n8n 进程。

错误:找不到输入字段 (Cannot find input field ‘…’ / Error getting binary data for item… / Property “…” does not exist)

  • 现象: 节点报错,提示在输入数据中找不到你配置的 输入二进制字段。
  • 解决方案:
    • 仔细检查字段名: 打开压缩节点编辑界面,查看上一步节点的 Input Data。确认包含二进制数据的那个字段,它的确切名称是什么(注意大小写),然后确保你在压缩节点的参数里填写的名称与之完全一致。
    • 确认数据存在: 确保上一步节点确实成功生成了二进制数据。如果上一步是下载,可能下载失败了;如果是读取文件,可能文件路径错了。

错误:压缩/解压失败 (Compression/Decompression failed / Invalid archive)

  • 现象: 节点执行了,但报错说压缩或解压操作本身失败了。
  • 解决方案:
    • 检查文件本身: 如果是解压,输入的压缩文件可能已经损坏,或者它的格式根本不是节点支持的 Zip 或 Gzip (比如它是个 RAR 文件)。尝试手动解压该文件看是否正常。
    • 检查文件来源: 确认生成或下载这个文件的步骤没有问题。

错误:只处理了第一个文件/Item (压缩多文件时)

  • 现象: 你输入了多个 Items,期望把它们包含的文件都压缩到一个包里,但结果压缩包里只有一个文件,或者只生成了一个压缩包(对应第一个 Item)。
  • 解决方案:
    • 使用聚合技巧: 参考前面“数据映射与表达式技巧”部分关于处理多个 Items 的方法,使用 Code 节点(推荐)或 Merge 节点先将所有二进制数据聚合到一个 Item 中,再送入压缩节点 。
    • 检查节点设置: 确认压缩节点设置里的 “Execute Once” 选项没有被意外开启。这个选项通常用于让节点只执行一次,即使收到多个 Items。

注意事项

在使用压缩节点时,还有一些地方需要留意:

  • 版本兼容性: n8n 的版本迭代很快,虽然压缩节点的核心功能相对稳定,但性能优化、Bug 修复或者一些细节行为可能随版本变化。建议保持你的 n8n 实例更新到较新的稳定版本,并在更新后留意相关节点的 Release Notes。
  • 二进制数据模式 (Binary Data Mode): 再次强调,理解 n8n 处理二进制数据的模式 (memory vs filesystem) 对性能和稳定性至关重要,尤其是在处理大文件或大量文件时 。对于自托管用户,根据你的服务器内存资源,合理配置 N8N_DEFAULT_BINARY_DATA_MODE 是一个重要的优化手段。n8n Cloud 用户通常无需关心这个,平台会处理。
  • 密码保护: 请注意,根据当前的官方文档 ,n8n 内建的压缩节点似乎 不直接支持 创建带有密码保护的 Zip 文件。如果你有这个需求(比如压缩敏感文件需要加密),你可能需要:
    • 寻找是否有社区开发的节点提供了这个功能。
    • 使用 Execute Command 节点调用支持密码参数的系统压缩命令(例如 zip -P password archive.zip file1 file2)。
  • 错误处理: 文件操作(包括压缩解压)总是有可能失败的,比如磁盘空间不足、文件权限问题、文件损坏等。在你的工作流设计中,应该考虑到压缩节点可能执行失败的情况。可以在节点设置 (Settings) 中配置 “Retry On Fail” 进行自动重试,或者设置 “Error Workflow” 将错误导向一个专门的处理流程,也可以在压缩节点之后使用 IF 或 Switch 节点,根据执行成功与否来决定后续走向。

掌握了压缩节点,你就拥有了在 n8n 中高效处理压缩文件的能力。接下来,让我们进入同样非常实用的图像处理领域!

编辑图像节点 (Edit Image)

概览

节点作用:

编辑图像 (Edit Image) 节点是 n8n 中一个非常强大的工具,它允许你在工作流内部,直接对图像文件进行各种常见的编辑和处理操作 4。想象一下,你可以在自动化流程中:

  • 调整图片的尺寸,让它符合网页或社交媒体的要求。
  • 裁剪图片,只保留需要的部分。
  • 给图片批量添加文字水印或 Logo。
  • 将多张图片合成为一张。
  • 转换图片的格式,比如把 PNG 转成 Jpeg。
  • 甚至做一些简单的模糊、旋转、添加边框等效果。

所有这些都可以在 n8n 工作流中自动完成,无需你手动打开 Photoshop 或其他图像编辑软件,也无需调用复杂的第三方图像处理 API。

核心价值:

  • 图像处理自动化: 将重复性的图像编辑任务自动化,例如为网店批量处理商品图片、自动生成报告中的图表截图、为社交媒体帖子生成配图等。
  • 提高效率: 节省大量手动编辑图片的时间和精力。
  • 流程整合: 将图像处理无缝集成到你的数据处理、内容发布等自动化流程中。
  • 降低门槛: 即使没有专业的图像处理技能,也能通过简单的节点配置完成常见的编辑任务。

重要依赖:GraphicsMagick

这是使用 Edit Image 节点 必须了解 的一个关键点。这个节点本身并不包含图像处理的所有逻辑,它依赖一个名为 GraphicsMagick 的外部图像处理库来完成实际的工作 4。

  • 如果你使用 n8n 官方的 Docker 镜像: 恭喜你,通常情况下你无需担心。官方镜像已经预装了 GraphicsMagick 。Edit Image 节点应该是开箱即用的。
  • 如果你使用其他方式安装 n8n (例如 npm 自行部署,或者 n8n Desktop 桌面版): 你很可能需要 手动安装 GraphicsMagick 。
    • 你需要去 GraphicsMagick 的官网 (或者像 SourceForge 这样的地方) 下载适合你操作系统的安装包并进行安装。
    • 安装时,务必确保勾选了“将安装路径添加到系统 PATH 环境变量”之类的选项 。这样 n8n 才能找到并调用它。
    • 安装完成后,最好在命令行(终端)里运行 gm version 或类似的命令,检查是否安装成功 。
    • 对于某些旧版本的 n8n Desktop,即使安装了 GraphicsMagick,可能还需要手动修改 n8n 安装目录下的一个 package.json 文件,把 Edit Image 节点的路径添加进去,才能在 n8n 界面中看到并使用这个节点 。
    • 如果在安装或使用中遇到问题,比如提示缺少 dll 文件或者报 0xc0150002 错误,可能还需要安装对应的 Visual C++ Redistributable 。

翔宇视角:

Edit Image 节点绝对是 n8n 的一大亮点,它极大地扩展了 n8n 在内容创作、电子商务、数字营销自动化等领域的能力。很多以前觉得必须手动 P 图或者写脚本才能搞定的事情,现在用 n8n 拖拽节点就能实现自动化,非常方便。但是!GraphicsMagick 的依赖问题是新手最容易卡住的地方 11。如果你发现 Edit Image 节点不工作或者报错,十有八九是 GraphicsMagick 没装好或者 n8n 没找到它。所以,在使用这个节点之前,务必先确认你的 n8n 环境(特别是自托管环境)满足这个依赖条件。解决了依赖问题,后面就海阔天空了。

参数配置

Edit Image 节点的配置相对丰富,因为它支持多种不同的图像编辑操作。我们先看通用参数,再逐一了解常用操作的特定参数。

通用参数:

  • 属性名称 (Property Name):
    • 作用: 这个参数是告诉 Edit Image 节点:“你要编辑的那张原始图片,在输入数据的哪个字段里?” 。你需要在这里填入包含原始图片二进制数据的字段名。
    • 来源: 这个字段通常来自前置节点,比如 HTTP Request 节点下载的图片、Read Binary File 节点读取的图片、或者 n8n Form 节点用户上传的图片。
    • 输出: 经过编辑处理后,输出的新图片的二进制数据,默认也会放在这个同名的字段下,覆盖掉原始数据。
  • 操作 (Operation):
    • 作用: 这是核心选择项,决定了你要对图片执行哪种编辑操作 。n8n 提供了多种预设的操作供你选择。

常用操作详解:

下面我们详细看看几种最常用的操作及其参数配置:

  • 调整尺寸 (Resize):
    • 用途: 改变图片的宽度和高度。
    • 参数:
      • 宽度 (Width): 目标宽度 (像素)。
      • 高度 (Height): 目标高度 (像素)。
      • 选项 (Option): 控制缩放行为的关键 。常用选项包括:
        • Ignore Aspect Ratio (忽略宽高比): 强制缩放到指定的宽高,可能会导致图片变形。
        • Maximum Area (最大区域): 按比例缩放,确保图片的宽度 不超过 指定宽度,高度 不超过 指定高度。这是保持比例缩小图片的常用选项。
        • Minimum Area (最小区域): 按比例缩放,确保图片的宽度 不小于 指定宽度,高度 不小于 指定高度。
        • Only if Larger (仅当更大时): 只有当原图比指定宽高都大时,才按比例缩小到指定尺寸。
        • Only if Smaller (仅当更小时): 只有当原图比指定宽高都小时,才按比例放大到指定尺寸。
        • Percent (百分比): 按原图尺寸的百分比进行缩放。比如 Width 和 Height 都填 50,就是缩小到原尺寸的 50%。
    • 翔宇实战理解: 这是最常用的功能之一。比如,你想把所有上传的图片宽度统一调整为 800 像素,并保持原始比例,可以选择 Option: Maximum Area,然后设置 Width: 800,Height 可以留空或者设置一个很大的值(比如 9999)。如果你需要固定尺寸的正方形头像,可以先用 Resize 的 Minimum Area 选项确保图片至少达到目标尺寸,再配合 Crop 操作进行裁剪。
  • 文本 (Text):
    • 用途: 在图片上添加文字,常用于加水印、标题、说明等。
    • 参数:
      • 文本 (Text): 你要添加的文字内容 。支持表达式,可以动态生成文字。
      • 字体大小 (Font Size): 选择文字的大小 。
      • 字体颜色 (Font Color): 设置文字颜色,可以用 Hex 颜色代码(如 #FF0000 表示红色)或点击色块选择 。
      • 位置 X (Position X) / 位置 Y (Position Y): 文字左上角在图片上的坐标 (像素) 。(0, 0) 是图片左上角。
      • 最大行长 (Max Line Length): (可选) 设置每行文字的最大字符数,超过会自动换行 。
      • 字体名称或 ID (Font Name or ID): (可选) 选择使用的字体 。默认可能只有几种基本字体。
    • 翔宇实战理解: 这个功能非常实用。但要注意 字体支持 是个关键点,也是个难点。
      • 默认字体: n8n 环境自带的字体可能很有限,不一定支持中文或其他特殊字符。
      • 自定义字体: 如果你想使用特定的字体(比如思源黑体来显示中文),你需要确保这个字体文件存在于 n8n 的运行环境中 。对于 Docker 用户,通常需要通过挂载 Volume 的方式把字体文件目录映射到容器里 。然后在这里通过字体文件的路径或名称来指定。
      • Unicode 渲染问题: 社区中有用户报告过,即使使用了支持的字体,某些 Unicode 字符(如泰米尔语、印地语)也可能出现渲染错误或乱码 。这可能是底层 GraphicsMagick 或相关库的问题。使用中文时也需要测试确认效果。
      • 文本对齐: 内建的 Text 操作似乎没有直接提供居中、右对齐等选项。如果你需要精确的文本布局,可能需要计算坐标,或者寻找像 n8n-nodes-edit-image-plus 这样的社区节点,它增强了文本对齐功能。
  • 合成 (Composite):
    • 用途: 将一张图片(称为“合成图”)叠加到另一张图片(称为“基础图”)上面。
    • 参数:
      • 属性名称 (Property Name): 包含 基础图 二进制数据的字段名 。
      • 合成图像属性 (Composite Image Property): 包含 合成图 (要叠加上去的图) 二进制数据的字段名 。
      • 操作符 (Operator): 控制两张图片如何混合 。有很多选项,如 Over (默认,前景叠在背景上), In, Out, Atop, Xor, Plus, Minus, Multiply 等,效果各不相同,需要根据需要选择。
      • 位置 X (Position X) / 位置 Y (Position Y): 合成图左上角在基础图上的坐标 。
    • 翔宇实战理解: 这个功能可以用来制作很多有趣的效果,比如给头像加个漂亮的相框(相框是合成图,头像是基础图),或者把 Logo(合成图)加到宣传海报(基础图)的角落。你需要确保工作流中有两个有效的图片二进制数据,分别对应基础图和合成图。如果想把 多张​ 图片按顺序叠加到一起(比如像图层一样),这个操作一次只能处理两张。社区的讨论表明,实现多图循环叠加通常需要更复杂的逻辑,比如在循环中使用 Code 节点来管理和传递中间结果画布 。
  • 裁剪 (Crop):
    • 用途: 从图片中截取一个矩形区域。
    • 参数:
      • 宽度 (Width) / 高度 (Height): 要裁剪出的区域的尺寸 。
      • 位置 X (Position X) / 位置 Y (Position Y): 裁剪区域左上角在原图上的坐标 。
    • 翔宇实战理解: 常用于提取图片主体、制作缩略图、或者将图片精确裁剪成特定宽高比。
  • 旋转 (Rotate):
    • 用途: 旋转图片。
    • 参数:
      • 旋转 (Rotate): 旋转的角度 (-360 到 360 度) 。正数通常表示顺时针。
      • 背景颜色 (Background Color): 当旋转角度不是 90 度的倍数时,图片会倾斜,出现一些空白的角落。这个参数用来设置填充这些空白区域的颜色 。
    • 翔宇实战理解: 旋转 90, 180, 270 度很常用。旋转任意角度时注意背景色的选择。
  • 模糊 (Blur):
    • 用途: 让图片变得模糊。
    • 参数:
      • 模糊 (Blur): 模糊的半径或强度 。值越大越模糊。
      • Sigma: 另一个控制模糊效果的参数 。通常与 Blur 半径配合使用。
    • 翔宇实战理解: 可以用来制作背景模糊效果,或者隐藏图片中的某些信息(但不是精确的打码)。
  • 边框 (Border):
    • 用途: 给图片添加一个纯色边框。
    • 参数:
      • 边框宽度 (Border Width) / 边框高度 (Border Height): 边框的厚度 。通常设为一样的值。
      • 边框颜色 (Border Color): 边框的颜色 。
    • 翔宇实战理解: 简单快速地给图片加个框。
  • 绘制 (Draw):
    • 用途: 在图片上绘制简单的几何图形。
    • 参数:
      • 图元 (Primitive): 选择要绘制的形状:Circle (圆), Line (线), Rectangle (矩形) 。
      • 颜色 (Color): 形状的颜色 。
      • 起始位置 X/Y (Start Position X/Y): 绘制的起点坐标 。
      • 结束位置 X/Y (End Position X/Y): (对线和矩形) 绘制的终点坐标 。
      • 圆角半径 (Corner Radius): (对矩形) 设置圆角的大小 。
    • 翔宇实战理解: 功能比较基础,适合在图片上加一些简单的标记或图形元素。
  • 获取信息 (Get Information):
    • 用途: 读取图片的元数据,比如宽度、高度、格式、大小等,但 不修改 图片本身。
    • 参数: 只需要指定 属性名称 (Property Name) 。
    • 输出: 输出的 Item 会在 json 数据中包含获取到的图片信息。
    • 翔宇实战理解: 这个操作很有用!比如,你可以在处理图片前先获取它的尺寸,然后根据尺寸决定是否需要 Resize,或者计算水印应该放在哪个位置。
  • 多步 (Multi Step):
    • 用途: 在 同一个 Edit Image 节点内,按顺序执行 多个 上面提到的编辑操作 。
    • 配置: 选择这个操作后,会出现一个新的 “Operations” 列表,你可以点击 “Add Operation” 来添加你想执行的编辑步骤,并为每个步骤配置相应的参数。步骤会按照添加的顺序依次执行。
    • 翔宇实战理解: 这是优化工作流结构的好方法。如果你需要对一张图片先 Resize,再加 Text 水印,最后转成 Jpeg 格式,你可以把这三个步骤都添加到 Multi Step 操作里,只需要一个 Edit Image 节点就能完成。这比你连接三个独立的 Edit Image 节点要更简洁,也可能更高效。

节点选项 (Node Options):

在配置完具体操作后,通常还有一些通用的节点选项可以设置:

  • 文件名 (File Name):
    • 作用: 为最终输出的编辑后图片指定一个文件名 。这个文件名会关联到输出的二进制数据上。
    • 用法: 可以直接输入静态文件名,如 processed_image.jpg,也支持表达式动态生成。
  • 格式 (Format):
    • 作用: 指定输出图片的格式 。
    • 选项: bmp, gif, jpeg, png, tiff, WebP。
    • 翔宇实战理解: 这个选项非常实用!比如,AI 绘图工具经常生成很大的 PNG 文件,你可以用 Edit Image 节点(即使只做格式转换,不做其他编辑)将它转换成体积更小的 Jpeg 或 WebP 格式,方便在网页上使用或传输。选择 Jpeg 时,n8n 可能会使用默认的压缩质量,如果需要精细控制质量,可能需要借助 Execute Command 调用 gm convert -quality 85 input.png output.jpg 这样的命令。

操作的顺序与组合

每个具体操作(如 Resize, Text)都是一个独立的步骤。当你需要进行多项编辑时,可以选择链式连接多个 Edit Image 节点,或者使用 Multi Step 操作将多个步骤组合在一个节点里 4。Multi Step 通常是更优的选择,因为它更清晰,并且可能减少重复读取和写入图像数据的开销。在 Multi Step 中,操作的顺序很重要,会影响最终结果(比如先裁剪再加水印,和先加水印再裁剪,结果可能不同)。

字体处理的挑战

再次强调,如果你需要在图片上添加文字(特别是中文或其他非英文字符),字体是一个需要特别关注的问题。你需要确保 n8n 的运行环境能够找到并使用你需要的字体 13。这在 Docker 环境下尤其需要注意,通常需要手动挂载包含字体文件的 Volume 13。并且,即使配置正确,也可能遇到某些字符的渲染问题,这可能源于底层的 GraphicsMagick 或相关库 13。这超出了简单的节点配置,可能需要一些系统管理知识或对已知问题的了解。

数据映射与表达式技巧

Edit Image 节点的很多参数都支持 n8n 的表达式,这让图像处理变得非常动态和智能。

动态参数设置:

几乎所有涉及数值、文本、颜色、位置的参数都可以使用表达式。

  • 尺寸:Width 可以设置为 {{ $json.maxWidth }},从前面的节点获取最大宽度限制。
  • 文本内容:Text 可以设置为 {{ $json.productName }} - {{ $json.price }},动态生成带价格的产品水印。
  • 颜色:Font Color 或 Border Color 可以根据某些条件动态改变,例如 {{ $json.status === 'urgent'? '#FF0000' : '#000000' }}。
  • 位置: 水印的位置 Position X, Position Y 可以根据图片尺寸动态计算。先用 “Get Information” 操作获取图片宽高 ($json.width, $json.height),然后在 Text 操作中设置 Position X 为 {{ $json.width - 150 }} (假设水印宽 150px,放在右边)。
  • 文件名:File Name 可以包含变量,如 {{ $json.userId }}_avatar.jpg。

处理图像数组/循环:

当你需要对一系列图片(比如来自 SplitInBatches 节点或循环操作的输出)应用相同的编辑操作时,Edit Image 节点通常会对每个传入的 Item 单独执行。例如,如果你有一个包含 10 个 Items 的输入,每个 Item 里有一张图片在 data 字段,那么 Edit Image 节点(配置为 Resize 操作)会依次处理这 10 张图片,并输出 10 个包含缩放后图片的 Items。

多图合成的挑战与技巧:

如前所述,使用 Composite 操作将 多个 不同的图片合成为 一个 最终图片(例如,制作图片拼贴、将多个图层叠加)是比较复杂的。

  • 问题:Composite 操作一次只能处理两张图片(基础图和合成图)。
  • 社区方案: 社区讨论 中提到的方法通常涉及:
    1. 初始化画布: 使用 Create 操作创建一个空白画布,或者使用第一张图片作为初始画布。
    2. 循环处理: 遍历剩余的图片。
    3. 逐步合成: 在每次循环迭代中,使用 Composite 操作(或者在 Code 节点中调用相应的库)将当前图片叠加到 上一次迭代的结果 上。
    • 翔宇技巧: 这需要仔细管理二进制数据在循环中的传递。你可能需要在每次迭代后,用 Set 节点将合成后的中间结果保存到一个固定的字段名(比如 currentCanvas),然后在下一次迭代中读取这个 currentCanvas 作为新的基础图,再把下一张图片叠加上去。Code 节点在这里可能更灵活,可以直接在内存中处理图像对象,避免反复读写二进制数据。

从 PDF 创建图像的注意事项:

Edit Image 节点(或者说它依赖的 GraphicsMagick)理论上可以读取 PDF 文件并将其转换为图像格式(如 PNG, Jpeg)。但在 n8n 中使用时有几个坑:

  • 默认只处理第一页: 如果 PDF 有多页,直接把 PDF 二进制数据输入 Edit Image 节点,通常只会转换第一页。
  • 处理后续页面: 要转换 PDF 的其他页面(比如第 2 页),你需要借助 Execute Command 节点,调用 GraphicsMagick (gm) 或 ImageMagick (convert) 的命令行工具,并使用特殊的语法指定页码(页码索引通常从 0 开始)。例如:gm convert "input.pdf" page2.png 表示转换第二页 (“)。
  • 需要 Ghostscript: PDF 是一种复杂的格式,GraphicsMagick/ImageMagick 在处理 PDF 时,通常还需要另一个名为 Ghostscript 的程序。你的 n8n 运行环境(特别是 Docker 容器)必须安装了 Ghostscript,Edit Image 节点才能正确处理 PDF。官方的 n8n Docker 镜像可能 不包含 Ghostscript。如果需要处理 PDF,你可能需要基于官方镜像构建一个自定义的 Docker 镜像,在 Dockerfile 中添加安装 Ghostscript 的命令(比如对于 Alpine Linux 基础镜像是 RUN apk add ghostscript)。

常用应用场景

Edit Image 节点的功能非常丰富,可以应用在各种自动化场景中。

场景一:博客文章头图自动生成

  • 流程:
    1. Airtable / Database Node: 读取新发布的文章信息,包含标题、作者名、封面图 URL(可选)。
    2. (Optional) HTTP Request Node: 如果提供了封面图 URL,下载封面图。
    3. Edit Image Node (Multi Step):
      • Step 1 (Optional): 如果有封面图,使用 Resize 将其调整到标准头图尺寸。如果没有,使用 Create 创建一个带背景色或背景图案的画布。输入/输出字段为 canvas。
      • Step 2: 使用 Text 操作,将文章标题写在 canvas 的合适位置,选择醒目的字体和颜色。
      • Step 3: 使用 Text 操作,将作者名写在标题下方或角落。
      • Step 4 (Optional): 使用 Composite 操作,将网站 Logo 图片叠加到 canvas 的角落。
    4. Edit Image Node (Final Output): (或者在 Multi Step 最后一步设置)
      • Property Name:canvas
      • Format:jpeg (或 WebP)
      • File Name:{{ $json.articleSlug }}_header.jpg
    5. Uploader Node (e.g., AWS S3, Cloudinary): 将生成的头图上传到 CDN 或文件存储。
    6. CMS Update Node (e.g., WordPress, Ghost): 将头图 URL 更新回文章。
  • 价值: 无需设计师介入,自动为每篇文章生成风格统一的头图。

场景二:电商产品图批量加水印

  • 流程:
    1. Trigger (e.g., Watch Folder, Webhook): 当有新的产品图片上传到某个位置或通过接口传入时触发。
    2. Read Binary File Node (if needed): 读取触发的文件。
    3. Edit Image Node:
      • Operation: Text (或 Composite 如果水印是图片 Logo)
      • Property Name: 输入图片字段名。
      • Text: 你的品牌名称或网址。
      • Font Size / Font Color: 设置合适的水印样式(通常半透明)。
      • Position X / Position Y: 计算或指定水印在图片右下角的位置。
      • (Optional) Format: 可以顺便统一输出格式,如 Jpeg。
    4. Write Binary File / FTP / CMS Update Node: 将添加水印后的图片保存到指定位置或更新到商品管理系统。
  • 价值: 保证所有产品图片的品牌一致性,防止盗图,完全自动化。

场景三:用户头像处理与标准化

  • 流程:
    1. n8n Form Trigger / Webhook: 用户通过表单上传头像,或通过 App 调用接口上传。输入包含图片二进制数据。
    2. Edit Image Node (Multi Step):
      • Step 1: Get Information: 获取上传图片的尺寸和格式。
      • Step 2: Resize: 使用 Minimum Area 选项,将图片等比缩放到至少需要的尺寸(比如 200×200)。
      • Step 3: Crop: 从缩放后的图片中心裁剪出 200×200 的正方形区域。
      • (Optional Step for Circular Avatars): 这比较复杂,可能需要用 Composite 操作将裁剪后的方形头像叠加到一个透明背景的圆形蒙版上,或者使用 Execute Command 调用 ImageMagick 的 -clip -mask 等高级命令。
    3. Edit Image Node (Output):
      • Format:png (如果需要透明背景) 或 jpeg。
      • File Name:user_{{ $json.userId }}_avatar.png
    4. Save Node (e.g., Write Binary File, S3 Upload): 保存处理后的标准头像文件。
  • 价值: 自动化处理用户上传的各种尺寸头像,生成统一规格的头像,提升网站或 App 的视觉一致性。

场景四:AI 生成图片格式转换与优化

  • 流程:
    1. AI Node (e.g., OpenAI DALL-E, Stability AI) / Webhook: 从 AI 绘图服务获取生成的图片(通常是 PNG 格式,体积较大)。
    2. Edit Image Node:
      • Operation: Resize (可选,如果需要调整尺寸)
      • Property Name: 输入 AI 图片的二进制字段。
      • (If only converting format, no other operation needed, can just set Node Options)
    3. Node Options:
      • Format:jpeg (设置较低质量以大幅减小体积) 或 WebP (兼顾质量和体积)。
      • File Name: (可选) 重命名。
    4. Save / Display Node: 将优化后的图片保存或用于展示。
  • 价值: 自动将 AI 生成的大文件 PNG 转换为更适合网络使用的 Jpeg 或 WebP 格式,显著减小文件体积,提升加载速度。

常见报错及解决方案

Edit Image 节点功能强大,但也可能遇到一些问题,尤其是与环境依赖相关的。

错误:节点执行失败 / 报错 / 无输出 (尤其在非 Docker 环境)

  • 现象: 节点变红,执行失败,或者看起来执行成功但没有输出预期的图片。
  • 最常见原因:​GraphicsMagick 未安装或 n8n 无法找到它 。
  • 解决方案:
    1. 确认安装: 打开你服务器的命令行(终端),输入 gm version 或 gm -version。如果提示命令未找到,说明没安装或者 PATH 没配置对。如果能显示版本号,说明安装了。
    2. 检查 PATH 环境变量: 确保 GraphicsMagick 的 bin 目录路径已经添加到了系统的 PATH 环境变量中,这样 n8n 才能在任何位置调用 gm 命令。修改 PATH 后通常需要重启 n8n 服务或服务器。
    3. 重启 n8n: 任何环境相关的更改(安装软件、修改环境变量)后,最好都重启一下 n8n 服务。
    4. (旧版 n8n Desktop 特有) 如果你用的是比较旧的桌面版,可能需要按照社区帖子 的方法,手动编辑 n8n 安装目录下的 package.json 文件,显式地把 Edit Image 节点的路径加进去。操作前务必备份 package.json 文件!
    5. 依赖库问题 (Windows): 在 Windows 上安装 GraphicsMagick 后,如果运行时提示缺少 dll 文件或报 0xc0150002 错误,通常是缺少 Visual C++ Redistributable 运行库。根据 GraphicsMagick 版本的要求(比如 提到可能需要 VS 2008 Redist),去微软官网下载并安装对应的版本 。
    6. 终极方案:使用 Docker: 如果你对折腾环境感到头疼,最省心的方法就是使用 n8n 官方提供的 Docker 镜像来运行 n8n 。官方镜像通常已经把 GraphicsMagick 这些依赖都内置好了。

错误:处理 PDF 时报错 / 只处理第一页 / 输出图片质量差

  • 现象: 尝试将 PDF 文件作为输入给 Edit Image 节点时,节点报错,或者只输出了 PDF 的第一页图片,或者输出的图片模糊不清。
  • 原因与解决方案:
    • 缺少 Ghostscript: 正确处理 PDF 文件,GraphicsMagick 通常需要 Ghostscript 的帮助。你需要确保运行 n8n 的环境(特别是 Docker 容器内)也安装了 Ghostscript。如果使用官方 Docker 镜像,你需要基于它创建一个自定义 Dockerfile,添加安装 Ghostscript 的命令(如 RUN apk add ghostscript),然后构建并使用这个自定义镜像。
    • 处理多页 PDF: Edit Image 节点本身不直接支持选择 PDF 页码。你需要使用 Execute Command 节点,调用 gm convert "input.pdf[页码索引]" output.png 这样的命令来转换指定页面(注意页码从 0 开始)。
    • 转换质量: PDF 转图片时,可以通过命令行参数(如 -density 300 设置分辨率)来提高输出质量,这也需要在 Execute Command 节点中实现。

错误:添加中文或其他 Unicode 文本时出现乱码 / 方框 / 渲染错误

  • 现象: 使用 Text 操作添加中文、日文、韩文或其他特殊字符时,图片上显示的不是正确的文字,而是乱码、问号、方框,或者文字重叠、错位。
  • 原因与解决方案:
    • 缺少字体: 最常见的原因是 n8n 运行环境中没有包含所需字符的字体文件 。
      • 安装/挂载字体: 你需要在服务器或 Docker 容器中安装包含这些字符的字体(比如 Noto Sans CJK, 思源黑体等)。对于 Docker,标准做法是创建一个本地文件夹存放 .ttf 或 .otf 字体文件,然后在运行容器时使用 -v /path/to/local/fonts:/usr/share/fonts/truetype/custom (路径可自定义) 将其挂载到容器的一个字体目录下 。
    • 指定字体: 在 Edit Image 节点的 Text 操作中,使用 字体名称或 ID (Font Name or ID) 参数,明确指定要使用的字体文件的名称或完整路径(相对于容器内的路径)。
    • 检查底层库 Bug: 即使字体配置正确,也可能遇到 GraphicsMagick 或其依赖库(如 FreeType, 或者像 Satori 这样的 SVG 转 PNG 库如果被间接使用)本身的渲染 Bug 。这种情况比较难解决,可能需要关注 n8n 或相关库的更新,或者寻找其他实现方式。

错误:Composite 操作找不到图像 / 报错

  • 现象: 使用 Composite 操作时报错,提示找不到输入图像或合成失败。
  • 解决方案:
    • 检查字段名: 确认 属性名称 (Property Name) (基础图) 和 合成图像属性 (Composite Image Property) (合成图) 都正确指向了包含有效图片二进制数据的字段。
    • 检查数据有效性: 确保这两个字段里的二进制数据确实是有效的、未损坏的图片。可以在前面加一个 Write Binary File 节点把它们存下来看看。
    • 格式兼容性: 检查两张图片的格式是否可能存在兼容性问题(虽然 GraphicsMagick 通常支持多种格式混合)。

错误:Stream yields empty buffer

  • 现象: 节点报错提示流产生空缓冲区。
  • 原因: 这通常意味着传递给节点的输入数据是空的,或者不是有效的图像数据。比如,上一步下载图片失败了,导致二进制字段为空;或者错误地把一个文本文件的二进制数据传给了 Edit Image 节点。
  • 解决方案: 仔细检查上游节点的输出,确保传递给 Edit Image 节点的 属性名称 字段里确实包含了有效的、非空的图像二进制数据。

注意事项

使用 Edit Image 节点时,请牢记以下几点:

  • GraphicsMagick 依赖: 这是前提,部署 n8n 前务必确认环境满足要求 。
  • 性能考虑: 图像处理是计算密集型操作,尤其是处理高分辨率大图或执行复杂操作(如模糊、复杂合成)时,会消耗较多的 CPU 资源。在配置较低的服务器上运行这类工作流,可能会导致执行缓慢或影响 n8n 整体性能。考虑优化流程,比如先缩小图片再处理,或者使用 Multi Step 减少节点开销。
  • 内存使用: 和 CPU 一样,处理大尺寸图片也会消耗大量内存。如果遇到内存不足的问题,记得检查 N8N_DEFAULT_BINARY_DATA_MODE 环境变量的设置。
  • 字体管理: 如果你需要使用 Text 功能添加非英文字符或特殊字体,字体文件的管理和配置是一个必须考虑的问题 。提前规划好如何在你的 n8n 环境中安装、挂载和引用这些字体。
  • 复杂操作的替代方案: Edit Image 节点提供了很多常用功能,但对于非常高级或复杂的图像处理任务(例如精细的图层操作、矢量编辑、内容识别填充、高级滤镜效果等),它可能力不从心。这时,可以考虑其他方法:
    • Execute Command 节点: 调用更专业的命令行图像处理工具,比如 ImageMagick (它比 GraphicsMagick 功能更全面,但可能资源消耗也更大),或者其他特定领域的工具。
    • 外部 API 服务: 调用像 Cloudinary, Imgix, 或者其他专门的图像处理 SaaS 服务的 API。
    • 社区节点: 浏览 n8n 社区市场,看看是否有其他开发者创建的、提供更强图像处理功能的社区节点。
  • 错误处理: 图像处理过程中可能发生各种错误(文件损坏、格式不支持、参数无效等)。务必在工作流中考虑错误处理逻辑,使用 “Retry On Fail”, “Error Workflow”, 或者 IF/Switch 节点来优雅地处理失败情况。
  • 版本兼容性: 随着 n8n 的更新,Edit Image 节点可能会增加新的操作、参数或改进现有功能。建议查阅你正在使用的 n8n 版本对应的官方文档,以获取最准确的信息。

Edit Image 节点是 n8n 中一颗强大的明珠,善用它能让你的自动化流程增色不少。接下来,我们将学习如何使用 FTP 节点连接和操作文件服务器。

FTP 节点 (FTP)

概览

节点作用:

FTP 节点是 n8n 用来与 FTP (File Transfer Protocol) 和 SFTP (SSH File Transfer Protocol) 服务器进行交互的工具 5。通过这个节点,你可以在你的自动化工作流中实现一系列文件服务器操作,包括:

  • 列出 (List): 查看服务器上某个目录里的文件和文件夹列表。
  • 下载 (Download): 从服务器把文件下载到 n8n 工作流中进行处理。
  • 上传 (Upload): 把 n8n 工作流中生成或处理的文件上传到服务器。
  • 删除 (Delete): 删除服务器上的文件或文件夹。
  • 重命名/移动 (Rename): 更改服务器上文件或文件夹的名称,或者将它们移动到不同的目录。

支持协议:

这个节点同时支持两种协议 5:

  • FTP: 传统的文件传输协议。数据传输通常是 未加密 的,安全性较低。
  • SFTP: 基于 SSH (Secure Shell) 的文件传输协议。所有数据传输(包括登录凭证和文件内容)都是 加密 的,安全性高得多。

核心价值:

  • 连接传统系统: 很多企业内部系统、遗留系统或者与合作伙伴的数据交换,仍然依赖 FTP/SFTP 服务器。这个节点提供了连接这些系统的能力。
  • 文件同步自动化: 实现 n8n 与文件服务器之间的文件自动同步、备份、分发和接收。
  • 整合工作流: 将文件服务器的操作无缝整合到更广泛的自动化流程中,例如,从 FTP 下载订单文件后自动处理并写入数据库。

翔宇视角:

虽然现在大家用 Google Drive, Dropbox 等云存储比较多,但在很多企业环境和特定场景下,FTP/SFTP 依然是文件交换的标准方式。翔宇在对接一些传统企业系统或者需要与特定服务器进行文件交互时,FTP 节点就成了必备工具。强烈建议大家优先使用 SFTP 协议,因为它能保证数据传输过程中的安全,避免敏感信息(如用户名、密码、文件内容)在网络上明文传输。配置 SFTP 稍微复杂一点(可能需要处理密钥),但安全性提升是值得的。

参数配置

要使用 FTP 节点,最重要的两部分配置是:凭证 (Credentials) 和 ​操作 (Operation)。

凭证 (Credentials):

这是连接服务器的钥匙,必须先配置好。你需要在 n8n 主界面的 “Credentials” 部分,点击 “Add Credential”,然后选择 “FTP” 或 “SFTP” 类型来创建。

  • 创建 FTP 凭证:
    • Credential Name: 给这个凭证起个名字,方便你在节点中选择,比如 My_Company_FTP。
    • Host: FTP 服务器的地址,可以是域名(如 ftp.example.com)或 IP 地址。
    • Port: FTP 服务器的端口号,默认通常是 ​21​。
    • Username: 登录 FTP 服务器的用户名。
    • Password: 对应的密码。
    • Encryption: (如果服务器支持)可以选择加密方式,如 Require explicit FTP over TLS。如果选择 None,则是普通的不加密 FTP。
    • Timeout: (可选) 连接超时时间(毫秒)。
  • 创建 SFTP 凭证:
    • Credential Name: 给凭证起名字,比如 My_Secure_SFTP。
    • Host: SFTP 服务器的地址(域名或 IP)。
    • Port: SFTP 服务器的端口号,默认通常是 ​22​。
    • Username: 登录 SFTP 服务器的用户名。
    • 认证方式 (Authentication Method): 这里通常有两种选择:
      • Password: 如果你的 SFTP 服务器允许使用密码登录,选择这项,并在 Password 字段输入密码。
      • Private Key:​(推荐) 这是更安全的方式。选择这项后,你需要提供:
        • Private Key: 将你的 私钥 文件内容 完整地 粘贴到这里。私钥必须是 ​OpenSSH 格式​。通常是以 -----BEGIN OPENSSH PRIVATE KEY----- 开头,以 -----END OPENSSH PRIVATE KEY----- 结尾的文本。你可以使用 ssh-keygen 等工具生成密钥对(一个公钥 id_rsa.pub 或类似,一个私钥 id_rsa)。你需要把 公钥 的内容添加到 SFTP 服务器上该用户的 ~/.ssh/authorized_keys 文件中。
        • Passphrase: (可选) 如果你在生成私钥时为它设置了一个密码(密码短语),你需要在这里输入这个密码,n8n 才能解密并使用这个私钥。如果私钥没有密码,就留空。
    • Timeout: (可选) 连接超时时间。
  • 翔宇实战理解 (凭证配置):
    • 安全第一: 再次强调,尽可能使用 SFTP + Private Key 认证。密码认证相对不安全。
    • 信息来源: Host, Port, Username, Password/Key 这些信息通常需要从你的服务器管理员或者服务提供商那里获取。仔细核对,填错任何一个都会导致连接失败。
    • 私钥格式: 确保粘贴的私钥是完整的、正确的 OpenSSH 格式。有时从不同工具生成的密钥格式可能需要转换。
    • 测试凭证: 在凭证编辑界面通常有 “Test credential” 按钮,创建或修改后一定要点击测试一下,确保 n8n 能用这个凭证成功连接到服务器。

操作 (Operation):

在 FTP 节点中选择了正确的凭证后,你需要选择要执行的具体操作 5。

常用操作详解:

  • 列表 (List):
    • 用途: 获取服务器上指定目录的内容列表。
    • 参数:
      • 路径 (Path): 你想查看的远程目录的路径,例如 /home/user/data/ 或者 public_html/files/ 。路径通常以 / 开头表示根目录或用户主目录下的绝对路径,但也可能相对于用户登录后的默认目录。需要根据服务器配置确认。
      • 递归 (Recursive): 一个开关 (布尔值) 。如果 ​开启​,它会列出指定路径下 所有 的文件和 所有子目录 中的文件和文件夹。如果 关闭 (默认),它只列出指定路径 当前层级 的文件和文件夹。
    • 输出: 通常会输出多个 Items,每个 Item 代表一个找到的文件或文件夹,包含 name, path, size, modifiedAt, isDirectory (是否为目录) 等信息。
    • 翔宇实战理解: 这是探查服务器文件结构的常用操作。但要注意,如果目标目录文件非常多,特别是开启 Recursive 时,可能会返回大量数据,消耗时间和资源,甚至可能超时。谨慎使用递归选项。
  • 下载 (Download):
    • 用途: 从服务器下载一个文件到 n8n 工作流中。
    • 参数:
      • 路径 (Path): 要下载的 文件 的 完整 远程路径,包括文件名,例如 /path/to/your/file.csv 。
      • 输出文件存放字段 (Put Output File in Field): 给下载下来的文件在 n8n 的二进制数据中起一个字段名 。比如填 downloadedFile。
    • 输出: 输出的 Item 中,你指定的字段 (downloadedFile) 会包含下载的文件内容(二进制数据)。
    • 翔宇实战理解: 这是将服务器上的数据取回 n8n 进行后续处理(如解析、转换、存入数据库等)的关键步骤。下载的文件是以二进制形式存在的。
  • 上传 (Upload):
    • 用途: 将 n8n 工作流中的文件上传到服务器。
    • 参数:
      • 路径 (Path): 文件要上传到服务器的 ​目标路径​,必须包含文件名 。例如 /remote/directory/new_report.pdf。
      • 二进制文件 (Binary File): 这是一个开关 。
        • 开启 (默认): 表示你要上传的是来自 n8n 输入 Item 中的 ​二进制文件数据​。这是最常用的方式。
        • 关闭: 表示你要上传的是 ​文本内容​,可以直接在下面的 文件内容 字段里输入文本。这相当于在服务器上创建一个包含你输入内容的新文本文件。
      • 输入二进制字段 (Input Binary Field): 仅在 Binary File 开关开启时显示 。你需要在这里填入包含要上传文件内容的二进制数据的字段名。这个数据通常来自前面的节点,比如 Read Binary File, HTTP Request, Edit Image, Spreadsheet File 等。
      • 文件内容 (File Content): 仅在 Binary File 开关关闭时显示 。你可以在这里直接输入文本内容。支持表达式。
    • 翔宇实战理解: 上传二进制文件是最核心的用途。你需要确保:1) 前面的节点确实生成了包含文件内容的二进制数据;2) 你在这里正确引用了那个二进制字段的名称;3) Path 参数指定了包含文件名的完整目标路径。目标文件名也可以使用表达式动态生成,这在需要根据日期或数据内容命名上传文件时非常有用 。
  • 删除 (Delete):
    • 用途: 删除服务器上的文件或文件夹。这是一个危险操作,请务必小心!
    • 参数:
      • 路径 (Path): 要删除的文件或文件夹的路径 。
      • 文件夹 (Folder): 一个开关 。默认关闭,只能删除文件。如果 ​开启​,则允许删除文件夹。
      • 递归 (Recursive): 仅在 Folder 开关开启时显示 。如果 ​开启​,并且你要删除的是一个文件夹,那么这个文件夹以及它里面 所有 的内容(包括子文件夹和文件)都将被 ​永久删除​!请极度谨慎使用此选项!
    • 翔宇实战理解: 删除操作不可逆。在自动化流程中使用删除,特别是递归删除时,一定要再三确认路径和逻辑是正确的,避免误删重要数据。最好在执行删除前,先用 List 操作检查一下目标,或者在工作流中加入人工确认步骤。
  • 重命名 (Rename):
    • 用途: 更改服务器上文件或文件夹的名称,或者将它们移动到不同的位置。
    • 参数:
      • 旧路径 (Old Path): 文件或文件夹当前的完整路径 。
      • 新路径 (New Path): 文件或文件夹的新名称或新位置的完整路径 。
      • 创建目录 (Create Directories): 一个开关 。如果 ​开启​,并且 New Path 指定的目录在服务器上不存在,n8n 会尝试自动创建这些不存在的父级目录。
    • 翔宇实战理解: 这个操作非常灵活。
      • 仅重命名:Old Path 是 /dir/oldname.txt,New Path 是 /dir/newname.txt。
      • 移动文件:Old Path 是 /dir1/file.txt,New Path 是 /dir2/file.txt。
      • 移动并重命名:Old Path 是 /dir1/old.txt,New Path 是 /dir2/new.txt。
      • Create Directories 选项在移动文件到新目录时特别有用,可以省去你先手动创建目录的麻烦。

凭证是基础,路径需精确

在使用 FTP 节点时,有两个关键点贯穿始终:

  1. 凭证是连接的基石: 几乎所有的连接问题,比如连接超时、认证失败、连接被拒绝,最终都可以追溯到凭证配置错误(主机、端口、用户名、密码/密钥不匹配)或网络层面的障碍(如防火墙阻止端口访问、服务器设置了 IP 白名单等) 。排查问题时,务必首先彻底检查凭证和网络连通性。
  2. 路径是操作的目标: 无论是列出、下载、上传、删除还是重命名,你都需要准确指定服务器上的路径 。你需要理解服务器的文件结构,区分绝对路径和相对路径(相对于用户登录后的默认目录),并确保路径字符串的正确性。特别是当使用表达式动态生成路径时,要保证表达式的计算结果是你期望的、在服务器上有效的路径 。路径错误可能导致“文件未找到”、“权限不足”等问题。

数据映射与表达式技巧

FTP 节点的操作参数,特别是路径相关的参数,都非常适合使用 n8n 的表达式来实现动态化。

动态路径配置:

Path, Old Path, New Path 这些参数都可以填入表达式。

  • 上传到按日期分类的目录:Path 可以设置为 /uploads/{{ $now.toFormat('yyyy/MM/dd') }}/{{ $json.fileName }}。这里 $now.toFormat('yyyy/MM/dd') 会生成像 2023/10/27 这样的日期路径部分。$json.fileName 假设来自前置节点的输出,包含了要上传的文件名。
  • 下载特定用户的文件:Path 可以设置为 /user_files/{{ $json.userId }}/profile.jpg。
  • 处理动态路径的挑战: 当路径是动态生成时,如果表达式的计算结果有问题(比如某个变量为空,或者拼接出的路径格式不对),节点可能会报错,提示 “Can’t get data for expression under ‘Path’ field” 或者类似的错误 。
  • 翔宇调试技巧: 遇到动态路径问题时,一个好方法是在 FTP 节点 之前 加一个 Set 节点。在 Set 节点里,专门用一个字段来构建你想要的完整路径字符串,使用同样的表达式。然后运行到 Set 节点,检查它的输出,看看生成的路径字符串是不是符合预期。如果路径没问题,再把这个 Set 节点输出的路径字段直接拖拽或引用到 FTP 节点的 Path 参数里。这样可以把路径构建的逻辑和 FTP 操作本身分开,更容易定位问题。同时,确保你用来引用前置节点数据的表达式语法正确,例如 {{ $('Node Name').first().json.fieldName }},这里的 Node Name 和 fieldName 都必须准确无误 。

处理二进制输入/输出:

  • 上传 (Upload): 当 Binary File 开关打开时,Input Binary Field 参数需要准确引用包含文件二进制数据的字段名。这个字段名决定了哪个文件会被上传。
  • 下载 (Download):Put Output File in Field 参数定义了下载下来的文件二进制数据存放在哪个字段名下。工作流中后续需要处理这个文件的节点(比如 Send Email 发送附件,Google Drive Upload 上传到云盘)就必须引用这个字段名来找到文件数据。

处理列表输出 (List 操作):

List 操作会返回多个 Items,代表目录中的文件和文件夹。如果你需要基于列表结果做进一步操作,比如:

  • 检查特定文件是否存在: 可以在 List 节点后加一个 IF 节点,设置条件检查返回的 Items 中是否有某个 name 等于你要找的文件名。
  • 只处理文件,忽略文件夹: 可以用 IF 节点过滤掉 isDirectory 为 true 的 Items。
  • 对每个文件执行操作: 可以将 List 的输出连接到一个需要处理文件的节点(如 Download),n8n 通常会为每个 Item 执行一次该节点。

常用应用场景

FTP 节点是连接 n8n 和文件服务器的枢纽,应用场景广泛。

场景一:每日备份网站文件到 SFTP 服务器

  • 流程:
    1. Schedule Trigger: 设置一个每天凌晨(比如 3 点)触发的定时器。
    2. Execute Command Node: (如果网站文件在 n8n 服务器本地)运行系统命令(如 tar 或 zip)将网站的目录打包成一个备份文件(例如 website_backup_{{ $now.toFormat('yyyyMMdd') }}.tar.gz)。
    3. Read Binary File Node: 读取上一步生成的备份文件,输出二进制数据到字段 backupFile。
    4. FTP Node (使用 SFTP 凭证):
      • Operation: Upload
      • Input Binary Field:backupFile
      • Path (Expression):/server_backups/website/website_backup_{{ $now.toFormat('yyyyMMdd') }}.tar.gz (确保目标目录存在)
    5. (Optional) Prune Backups: 可以再加一个 List 操作列出备份目录,然后用 Function/Code 节点判断哪些是旧备份,最后用 Delete 操作删除过期的备份文件。
  • 价值: 实现网站文件的全自动、增量或全量备份,并存储到安全的远程服务器。

场景二:从合作伙伴 FTP 下载并处理每日订单文件

  • 流程:
    1. Schedule Trigger: 设置一个定时器,比如每小时检查一次。
    2. FTP Node (List):
      • Path:/partner_orders/incoming/ (合作伙伴放置订单文件的目录)
    3. IF Node / Function Node: 检查 List 操作的输出。判断是否有新的 .csv 文件(比如根据文件名包含日期,或者与上次处理记录对比)。
    4. FTP Node (Download – in loop or for specific file):
      • Path: 新发现的订单文件的完整路径。
      • Put Output File in Field:orderCsvFile
    5. Spreadsheet File Node (Read): 读取 orderCsvFile 的内容。
    6. Database Node / API Node: 将订单数据写入内部数据库或 ERP 系统。
    7. FTP Node (Rename/Move): 将处理完的订单文件从 /incoming/ 目录移动到 /processed/ 目录,避免重复处理。
      • Operation: Rename
      • Old Path: 下载的订单文件路径。
      • New Path:/partner_orders/processed/{{ $json.fileName }} (假设 $json.fileName 包含文件名)
  • 价值: 自动化与合作伙伴的数据交换流程,及时获取并处理订单,减少人工操作和延误。

场景三:将 n8n 生成的个性化报告分发到不同用户的 SFTP 目录

  • 流程:
    1. Workflow generates reports: 工作流前面部分可能从数据库查询数据,为多个用户生成了不同的 PDF 报告(例如,每个用户一个 Item,包含报告二进制数据在 reportPdf 字段,以及用户的 userId)。
    2. FTP Node (Upload – executed for each user’s report Item):
      • Operation: Upload
      • Input Binary Field:reportPdf
      • Path (Expression):/user_reports/{{ $json.userId }}/monthly_report_{{ $now.toFormat('yyyyMM') }}.pdf (动态生成每个用户的目标路径)
      • (Need to ensure user directories exist, or use Rename with Create Directories if uploading to temp then moving)
  • 价值: 实现个性化报告的自动、精准分发,将正确的文件发送到正确的用户目录。

常见报错及解决方案

连接外部服务器总是可能遇到各种问题,FTP/SFTP 也不例外。

错误:连接失败 (Connection Failed / Timeout / ECONNREFUSED / Connection refused)

  • 现象: 节点尝试连接服务器,但长时间无响应后报错,或者立刻被拒绝。
  • 原因:
    • 凭证信息错误:Host, Port 不正确 。
    • 网络不通:n8n 服务器无法访问目标服务器的 IP 和端口。可能是中间有防火墙拦截 。
    • 服务器未运行:目标 FTP/SFTP 服务没有启动。
    • 协议/端口不匹配:你用了 FTP 凭证去连 SFTP 端口 (22),或者反之。
  • 解决方案:
    1. 仔细核对凭证: 确保 Host (没有多余空格), Port (21 for FTP, 22 for SFTP), Username 都完全正确。
    2. 测试网络连通性: 如果可能,尝试从运行 n8n 的服务器上,使用命令行工具测试连接:
      • telnet <host> <port> (例如 telnet ftp.example.com 21)
      • ssh <user>@<host> -p <port> (例如 ssh user@sftp.example.com -p 22) 如果这些命令也无法连接,说明是网络层面的问题,需要检查防火墙设置、安全组规则、或者联系网络管理员。
    3. 检查 IP 白名单: 很多服务器会配置 IP 白名单,只允许特定的 IP 地址连接。确认 n8n 服务器的公网 IP 地址是否已经被添加到了目标服务器的允许列表里 。
    4. 确认协议和凭证类型匹配: 使用 FTP 凭证连接 FTP 端口,使用 SFTP 凭证连接 SFTP 端口。

错误:认证失败 (Authentication Failed / Permission Denied / Invalid credentials)

  • 现象: 连接成功,但在登录时失败。
  • 原因:
    • 用户名或密码错误。
    • (SFTP 密钥认证) 私钥内容不正确、格式错误 (不是 OpenSSH 格式)、私钥与服务器上的公钥不匹配、或者私钥有密码但 Passphrase 没填或填错 。
  • 解决方案:
    1. 核对用户名/密码: 区分大小写,确保没有多余空格。
    2. 检查密钥:
      • 确认粘贴到 n8n 凭证里的私钥内容是完整的,从 -----BEGIN... 到 -----END...。
      • 确认服务器上对应用户的 ~/.ssh/authorized_keys 文件里添加的是正确的 公钥 内容。
      • 确认私钥文件本身没有损坏。
      • 如果私钥有密码,确保 Passphrase 输入正确。

错误:end: No SFTP connection available

  • 现象: 连接似乎建立了,但在执行操作(如 List, Upload)的过程中突然中断,并报这个错误 。
  • 原因: 这通常表示连接意外关闭。可能的原因包括:
    • 网络不稳定。
    • 服务器端主动断开连接(可能因为超时、资源限制、或者触发了某些规则)。
    • IP 白名单问题也可能导致此现象,即连接初步建立后被服务器防火墙规则中断 。
  • 解决方案:
    1. 检查网络稳定性。
    2. 确认 IP 白名单: 再次确认 n8n 服务器 IP 在允许列表内 。
    3. 联系服务器管理员: 询问是否有连接时间限制、并发连接数限制或其他可能导致连接中断的服务器端设置。检查服务器日志可能会有线索。

错误:连接未关闭 / read ECONNRESET / 后续连接失败

  • 现象: FTP/SFTP 节点执行成功完成,但似乎底层的连接没有立即关闭。导致在短时间内(比如几分钟内)再次尝试使用 相同凭证 连接同一服务器时失败,报 ECONNRESET (连接被重置) 或类似错误 。
  • 原因: 这可能是 n8n 使用的底层 FTP/SFTP 库与 特定 服务器软件之间在处理连接关闭握手时存在兼容性问题或 Bug 。n8n 可能发送了关闭请求,但服务器没有正确响应或处理,导致连接在服务器端“挂起”了一段时间。
  • 解决方案:
    1. 等待: 最简单的(但不理想)方法是等待足够长的时间(比如 10 分钟),让服务器端超时并自动清理掉那个挂起的连接,然后再尝试连接。
    2. 了解服务器信息: 尝试获取对方服务器使用的 FTP/SFTP 软件名称和版本,看是否存在已知的与 n8n (或其使用的 ssh2-sftp-client, basic-ftp 等库) 的兼容性问题。
    3. 向 n8n 社区/支持求助: 在 n8n 社区论坛发帖,提供详细信息(你的 n8n 版本、节点配置、复现步骤、对方服务器信息、错误日志),看是否有其他用户遇到类似问题或官方能提供帮助 。可能需要配合官方提供 Debug 版本的 n8n 来抓取更详细的日志。
    4. 变通方案: 如果问题持续存在且无法解决,可以考虑使用 Execute Command 节点调用系统的 sftp 或 ftp 命令行工具来执行操作,或者像社区用户那样编写外部脚本并通过 CronJob 等方式执行 。

错误:路径错误 / 文件未找到 (Path Error / File Not Found / No such file)

  • 现象: 节点报错,提示找不到你指定的远程路径或文件。
  • 原因:
    • 路径字符串本身拼写错误。
    • 使用了错误的路径分隔符(虽然 n8n 可能尝试处理,但最好还是用 /)。
    • 路径是相对路径,但当前工作目录不是你预期的。
    • 文件或目录确实不存在。
    • (动态路径) 表达式计算结果不正确 。
  • 解决方案:
    1. 仔细检查路径: 确认路径的每一部分都正确。
    2. 使用 List 操作确认: 在执行 Download/Upload/Delete/Rename 操作前,先用 List 操作看看目标文件或父目录是否存在,以及确切的名称和路径是什么。
    3. 尝试绝对路径: 如果不确定相对路径的基准,尝试使用从根目录 / 或用户主目录 ~ 开始的绝对路径。
    4. 检查动态路径表达式: 如果路径是动态生成的,务必检查表达式的计算结果是否符合预期 。

错误:动态路径表达式错误 (Can't get data for expression...)

  • 现象: 节点在尝试计算路径表达式时失败 。
  • 原因: 表达式语法错误,或者引用的变量(来自 $json, $item, $env 等)不存在或值为 null/undefined。
  • 解决方案:
    1. 检查表达式语法: 确保大括号 {{ }} 匹配,函数调用正确,变量名无误。
    2. 检查数据来源: 确认表达式中引用的节点名称(如 $('Node Name'))和字段名称(如 .json.fieldName)是存在的,并且在前置节点的输出数据中有值 。
    3. 使用 first() 或处理 $items: 如果前置节点可能输出多个 Items,你需要决定是只取第一个 Item 的数据 (first()) 还是需要遍历处理 ($items)。
    4. 使用 Set 节点调试: 如前所述,在 FTP 节点前加一个 Set 节点,用它来计算表达式并输出结果,方便检查 。

注意事项

最后,使用 FTP 节点时,务必注意以下几点:

  • 安全性:
    • 优先 SFTP: 尽可能选择 SFTP 协议,尤其是通过公网传输时。
    • 凭证管理:​绝对不要 在工作流的节点参数(如 Function 节点的代码)中硬编码密码或私钥。务必使用 n8n 内建的凭证管理系统来存储和调用这些敏感信息。n8n 会对存储的凭证进行加密 。
    • 密钥安全: 如果使用密钥认证,妥善保管你的私钥文件,不要泄露。
  • 错误处理: 网络传输和文件系统操作 inherently 不可靠。你的工作流 必须 包含错误处理逻辑。利用节点的 “Settings” -> “Retry On Fail” 设置自动重试(比如对于临时的网络波动),以及 “Continue On Fail” 或 “Error Workflow” 来定义失败后的处理路径(例如记录错误日志、发送通知、执行备用方案)。
  • 防火墙与 IP 白名单: 在企业环境中,n8n 服务器的 IP 地址通常需要被添加到目标 FTP/SFTP 服务器的防火墙允许列表或 IP 白名单中,否则连接会被阻止 。部署前务必与服务器管理员沟通确认。
  • 服务器限制: 目标 FTP/SFTP 服务器可能存在各种限制,例如:
    • 并发连接数限制: 不要让你的 n8n 工作流过于频繁地同时发起大量连接。
    • 上传/下载速度限制: 大文件传输可能需要较长时间。
    • 磁盘配额限制: 上传文件前最好确认目标目录有足够的空间。
    • 文件数量/大小限制: 某些服务器可能对单个目录的文件数量或单个文件的大小有限制。 在设计自动化任务时要考虑到这些潜在限制,避免因超出限制而导致失败。
  • 递归操作风险: List 和 Delete 操作的 Recursive (递归) 选项非常强大,但也非常危险 。递归删除一旦执行错误,可能导致灾难性的数据丢失。递归列出非常大的目录树也可能导致性能问题或超时。使用递归选项前,务必百分之百确定你的目标路径和操作意图是正确的。
  • 社区节点: 除了 n8n 内建的 FTP 节点,社区也可能贡献了其他相关节点。例如,n8n-nodes-ftp-trigger 可以在 FTP/SFTP 服务器上发生文件创建、更新、删除等事件时 触发 n8n 工作流,这对于实时响应服务器文件变化的场景非常有用。你可以根据需要在 n8n 的社区节点市场中搜索。

FTP 节点是连接 n8n 和文件服务器世界的关键工具。理解了它的配置、技巧和注意事项,你就能在自动化流程中自如地进行文件交互了。接下来,我们将学习如何使用 n8n Form 节点来创建交互式表单,让你的工作流能够与人对话。

n8n 表单节点 (n8n Form)

概览

节点作用:

n8n 表单 (n8n Form) 节点,以及它的“孪生兄弟” n8n 表单触发器 (n8n Form Trigger) 节点,是 n8n 中用于创建 交互式网页表单 的核心工具 6。它们让你的自动化工作流不再仅仅是后台默默运行的程序,而是能够:

  • 收集用户输入: 通过网页表单向用户提问,获取他们填写的信息(文本、数字、日期、文件等)。
  • 展示信息: 在流程中向用户展示需要确认或了解的信息。
  • 获取用户决策: 让用户通过表单选项(如下拉菜单、按钮)来决定工作流的下一步走向。
  • 实现多步骤交互: 构建包含多个页面的表单,引导用户逐步完成信息提交或操作。

与 Form Trigger 的关系 (非常重要):

理解这两个节点的分工与合作,是正确使用 n8n 表单功能的关键:

  • n8n 表单触发器 (n8n Form Trigger):
    • 角色: 必须是整个工作流的 第一个节点 (启动节点) 。
    • 功能:
      1. 定义并显示 第一个 表单页面。
      2. 生成访问这个表单流程的 初始 URL (包括测试 URL 和生产 URL)。
      3. 当用户提交第一个表单时,触发 工作流开始执行,并将用户提交的数据作为工作流的初始输入。
  • n8n 表单 (n8n Form):
    • 角色: 用于工作流的 中间步骤 。
    • 功能:
      1. 定义并显示 后续 的表单页面(第二页、第三页…)。
      2. 可以接收来自 前一个节点 的数据,并在表单中显示或预填这些数据。
      3. 当用户提交这个表单页面时,将收集到的数据传递给 下一个节点 继续处理。
      4. 也可以配置为流程的 结束页面 (Form Ending),向用户显示最终的确认信息或感谢语。

简单来说:Trigger 开头,Form 接力。一个典型的多步表单工作流看起来是这样的:

n8n Form Trigger -> Node A (处理第一页数据) -> n8n Form (显示第二页) -> Node B (处理第二页数据) -> n8n Form (显示结束页)

核心价值:

  • 人机协作: 让自动化流程能够在关键节点暂停,等待人工输入或确认,实现更灵活、更智能的自动化。
  • 简化数据收集: 提供一个无需编码即可创建网页表单的方式,方便地从用户那里收集结构化数据。
  • 引导式流程: 通过多步表单,可以引导用户按照预定步骤完成复杂任务或信息提交。

翔宇视角:

n8n 表单节点是 n8n 实现真正“交互式”自动化的点睛之笔。很多时候,完全自动化的流程并不完美,我们需要在某个环节加入人的判断或输入。比如,审批流程需要领导点击“同意”或“拒绝”;数据录入流程需要用户填写详细信息;配置任务需要用户选择参数。n8n Form 节点(及其 Trigger)完美地解决了这些需求。它让 n8n 不仅仅能连接机器,更能连接人。掌握好这两个节点的配合使用,你的 n8n 工作流将变得更加强大和实用。

参数配置

由于 Form 和 Form Trigger 紧密相关,我们先快速回顾一下 Trigger 的关键配置,然后重点讲解 Form 节点的配置。

n8n Form Trigger 关键配置回顾 (作为基础): 7

当你把 n8n Form Trigger 作为第一个节点添加到工作流时,你需要配置:

  • 表单元素 (Form Elements): 定义 第一个 表单页面的内容。
    • 字段标签 (Field Label): 显示给用户看的问题或提示文字。
    • 元素类型 (Element Type): 选择输入框类型,常用如:
      • Text: 单行文本输入。
      • Textarea: 多行文本输入。
      • Email: 邮箱格式输入。
      • Password: 密码输入(masked)。
      • Number: 数字输入。
      • Date: 日期选择器。
      • Dropdown List: 下拉选择菜单(可添加选项 Add Field Option,可开启 Multiple Choice 多选)。
      • File: 文件上传(可开启 Multiple Files 多文件上传,可设置 Accept File Types 限制文件类型)。
      • Custom HTML: 嵌入只读的 HTML 代码(如说明、链接、图片、视频,但不能含脚本、样式、输入元素)。可设置 Element Name 将 HTML 内容加入输出。
      • Hidden Field: 隐藏字段,用户不可见,用于传递数据(可设置默认值 Field Value 或通过 URL 参数传入)。
    • 必填字段 (Required Field): 勾选表示该字段必须填写。
  • 表单路径 (Form Path): (可选) 自定义表单 URL 的路径部分,例如 my-request-form。
  • 表单标题 (Form Title): 显示在浏览器标签页和表单顶部的 H1 标题。
  • 表单描述 (Form Description): 显示在标题下方的小标题或描述文字,支持 HTML 换行 (<br> 或 \n)。
  • 认证 (Authentication): (可选) 设置访问表单是否需要 Basic Auth 用户名密码。
  • 响应方式 (Respond When / Form Response): 配置用户提交 第一个 表单后的行为:
    • Form Is Submitted (立即响应):
      • Respond With > Form Submitted Text: 显示一段确认文字。
      • Respond With > Redirect URL: 跳转到指定的 URL。
    • Workflow Finishes (等工作流执行完再响应): 这通常用于 Trigger 后面直接就是结束的情况,或者你想根据工作流执行结果来决定最终响应(但这在 Trigger 节点上配置不常见)。
  • URL: 节点会自动生成 测试 URL (Test URL) 和 ​生产 URL (Production URL)。
    • Test URL: 用于开发和测试。在 n8n 编辑器中点击 “Test Workflow” 或 “Test Step” 运行,然后访问 Test URL 提交表单,可以在编辑器中看到数据流和执行结果,方便调试。
    • Production URL: 用于 激活 (Active) 状态的工作流。用户访问这个 URL 提交表单会触发后台的自动化执行。

n8n Form 节点配置详解: 6

当你在工作流中间添加 n8n Form 节点时,你需要配置:

  • 页面类型 (Page Type):
    • 定义表单 (Define Form):​(最常用) 选择这个类型来创建工作流 中间 的表单页面。当工作流执行到这个节点时,它会暂停,并向用户展示你在这里定义的表单。用户提交后,工作流带着用户输入的数据继续向下执行。
    • 表单结束 (Form Ending): 选择这个类型来定义整个表单流程的 ​最终页面​。它通常放在工作流各个分支的末端。当工作流执行到这里时,会向用户显示一个结束信息(确认、感谢或重定向),并且 通常不会再继续执行后续节点 (除非特殊配置)。
  • (当 Page Type 为 Define Form 时) 表单元素 (Form Elements):
    • 作用: 定义 当前这个 表单页面上要显示给用户的字段。
    • 配置方式: 和 Form Trigger 一样,可以通过 UI 或 JSON 来定义 。JSON 方式对于需要根据前置节点数据动态生成表单结构的情况更灵活。
    • 字段类型 (fieldType): 与 Form Trigger 支持的类型基本相同:date, dropdown, email, file, number, password, text, textarea 。同样可以配置 fieldOptions, multiselect, multipleFiles, acceptFileTypes 等。
    • 自定义 HTML (Custom HTML): 同样可以嵌入只读 HTML 。
      • 翔宇实战理解: 在多步表单中,Custom HTML 非常适合用来展示上一步的处理结果、提供当前步骤的说明、或者显示需要用户确认的信息。但如社区讨论 指出的,用它来深度定制表单外观(比如改背景色、字体样式)比较困难,它更侧重于内容嵌入。如果需要复杂样式,考虑将 n8n Webhook 作为后端,自己在外部网页上构建前端表单 。
    • 隐藏字段 (Hidden Field): 同样可以用来在用户无感知的情况下,将工作流内部的数据(如上一步生成的 ID、状态标记等)传递到表单提交的数据中 。可以通过设置字段的 Value (值) 参数,并使用表达式 {{ $json.somePreviousData }} 来实现。
  • (当 Page Type 为 Form Ending 时) 结束页配置 (On n8n Form Submission):
    • 作用: 定义当用户完成整个表单流程(到达这个 Form Ending 节点)时,给用户看什么。
    • 选项:
      • 显示完成屏幕 (Show Completion Screen): 显示一个最终的确认页面。可以自定义 完成标题 (Completion Title) 和 完成消息 (Completion Message)。还可以设置 完成页面标题 (Completion Page Title) (浏览器标签页标题)。
      • 重定向到 URL (Redirect to URL): 将用户跳转到你指定的另一个网址。需要填写 URL 字段。
      • 显示文本 (Show Text): 显示一段自定义的文本或 HTML 内容。需要填写 Text 字段。
  • 节点选项 (Node Options): (适用于 Define Form 和 Form Ending 两种 Page Type)
    • 表单标题 (Form Title): 设置 当前这个 表单页面的 H1 标题和浏览器标签页标题。
    • 表单描述 (Form Description): 设置当前页面的副标题或描述,支持 HTML。
    • 按钮标签 (Button Label): 自定义当前页面提交按钮上显示的文字(例如 “下一步”, “提交审批”, “完成”)。

Trigger 与 Form 的协同机制

理解这两个节点如何协同工作至关重要。Form Trigger 提供了整个流程的入口 URL 和第一页表单。用户提交第一页后,数据流向后续节点。当流程需要再次与用户交互时,就使用 n8n Form 节点。这个 Form 节点会“接管”用户的浏览器会话(基于之前 Trigger 启动的会话),展示第二页表单。用户提交第二页后,数据再流向更后面的节点。这个过程可以重复多次,形成多步表单。最后,通常会有一个或多个 n8n Form 节点(配置为 Form Ending)来结束整个交互流程。这种设计允许你在表单的每一步之间插入任意的 n8n 逻辑节点(如数据处理、API 调用、条件判断等)。

表单功能的边界认知

n8n 内建的表单节点提供了创建基础到中等复杂度交互式表单的能力。然而,它并不是一个全功能的表单构建器。对于一些非常高级的表单需求,它可能支持不足,例如:

  • 复杂的客户端逻辑: 如根据用户在一个字段的选择,动态显示或隐藏另一个字段;实时计算字段值;级联下拉菜单等。
  • 复杂的验证规则: 内建的只有“必填”验证,不支持自定义格式验证(如身份证号、特定格式的编号)或复杂的跨字段验证。社区有人尝试通过修改模板注入 JS 库来实现,但这需要技术能力且有风险 。
  • 重复区段 (Repeating Sections): 比如让用户可以动态添加多个“子女信息”或“工作经历”的输入区。内建节点不支持这种动态结构 。
  • 大幅度的样式定制: 如前所述,通过 Custom HTML 只能有限嵌入内容,难以完全改变表单的整体外观和布局 。

认识到这些边界很重要。如果你的需求超出了这些范围,可能需要考虑使用专业的在线表单服务(如 Typeform, Jotform)并通过 Webhook 与 n8n 集成,或者自己构建前端表单并使用 n8n 作为后端处理。

数据映射与表达式技巧

n8n 表单节点与表达式结合,可以实现非常灵活的交互。

访问表单提交的数据:

当用户提交了一个 n8n Form 节点(类型为 Define Form)后,紧跟其后的节点可以通过标准的 $json.fieldName 方式来访问用户在该表单页输入的数据。这里的 fieldName 通常是你在表单元素中设置的 字段标签 (Field Label)。如果标签包含空格或特殊字符,n8n 可能会对其进行转换(比如空格变下划线),你需要在 Input/Output Data 面板中确认实际的字段名。对于 Custom HTML 元素,如果设置了 Element Name,则可以通过 $json.elementName 访问其内容。

预填表单字段 (Prefilling):

这是 n8n Form 节点(Define Form 类型)非常有用的一个功能。你可以利用来自 前置节点 的数据,预先填充当前表单页面的字段值,让用户确认或修改。

  • 方法: 在配置表单元素的 Value (值) 或类似参数时,使用表达式。
  • 示例:
    • 一个文本框 字段标签 叫 “客户姓名”,它的 Value 可以设置为 {{ $json.customerNameFromDB }},这样表单加载时就会自动填入从数据库查到的客户姓名。
    • 一个下拉菜单 字段标签 叫 “当前状态”,它的 Default Value (默认值) 可以设置为 {{ $json.currentStatus }},自动选中之前的状态。
    • 一个 Textarea 字段标签 叫 “备注”,它的 Value 可以设置为 {{ $json.previousNotes }},显示之前的备注供用户补充。

使用隐藏字段 (Hidden Field) 传递上下文数据:

Hidden Field 是在多步表单或需要传递内部状态时非常有用的工具。

  • 作用: 你可以将工作流中重要但不希望用户看到或修改的数据(比如一个记录的 ID、当前的处理阶段标记、上一步操作的结果代码等)通过 Hidden Field 传递下去。
  • 方法: 添加一个 Hidden Field 元素,在它的 Field Value 参数中使用表达式,引用你想传递的数据,例如 {{ $json.recordId }} 或 {{ $execution.id }} (传递当前工作流执行 ID)。
  • 结果: 当用户提交表单时,这个 Hidden Field 的值也会包含在提交的数据中,后续节点就可以获取到这个隐藏的上下文信息。

利用查询参数预设初始值 (Query Parameters – 主要用于 Form Trigger):

对于 第一个 表单页面(由 Form Trigger 显示),你可以通过在 生产 URL 后面附加查询参数的方式来预设字段的初始值 7。

  • 场景: 比如你从你的 CRM 系统发送一封邮件给客户,邮件里包含一个链接指向 n8n 表单,你希望点击链接后,表单里的“姓名”和“邮箱”字段能自动填上客户的信息。
  • 方法: 假设你的 Form Trigger 生产 URL 是 https://n8n.example.com/form/feedback,表单里有 字段标签 为 “姓名” 和 “邮箱地址” 的字段。你可以在 CRM 生成的链接是:https://n8n.example.com/form/feedback?姓名=张三&邮箱地址=zhangsan%40example.com。
  • 注意:
    • 查询参数的名称必须与表单字段的 字段标签​完全匹配​。
    • 参数值如果包含特殊字符(如 @, 空格),需要进行 URL 编码 (Percent Encoding),例如 @ 编码为 %40,空格编码为 %20。
    • 这个功能 ​只对生产 URL 有效​,对测试 URL 无效。
    • 这个预设值会被表单元素自己配置的 Value 或 Default Value 覆盖(如果配置了的话)。

动态 HTML 内容 (Custom HTML):

虽然 Custom HTML 元素本身的内容是静态填写的,但如果你想在表单中动态展示一些 HTML 信息(比如根据前置节点结果显示不同的提示),可以这样做:

  1. 在 n8n Form 节点之前,加一个 Set 或 Function 节点,用代码或表达式生成你想要的 HTML 字符串,并存到一个字段里,比如 dynamicHtmlContent。
  2. 在 n8n Form 节点的 Custom HTML 元素中,不要 直接填写 HTML,而是:
    • 设置一个 Element Name,比如 infoDisplay。
    • 在 Custom HTML 的内容区域(通常是一个文本框),使用表达式引用之前生成的 HTML 字符串:{{ $json.dynamicHtmlContent }}。 这样,表单显示时,会把 dynamicHtmlContent 里的 HTML 渲染出来。并且因为设置了 Element Name,这个 HTML 内容也会包含在表单的输出数据中。

Wait 节点与表单数据的特殊性:

当 n8n Form 与 Wait 节点结合使用(Wait 节点设置为 Resume: On Form Submitted)来实现人工审批或干预时,访问 Wait 节点内嵌表单提交的数据,可能与访问普通 Form 节点不同 20。社区有用户报告称,在 Wait 节点之后的节点里,使用 $json.fieldName 无法直接获取到 Wait 表单的输入 20。

  • 可能原因: Wait 节点的表单提交是用来 恢复 (resume) 一个已经暂停的工作流执行。这个恢复动作可能将表单数据放在了执行上下文 (execution context) 的一个特殊位置,而不是像常规节点那样简单地作为下一个节点的输入 $json。
  • 潜在访问方式 (需验证): 可能需要尝试访问 $resumeData 变量,或者检查 Wait 节点自身的输出(在 Executions 视图中仔细看),看数据到底放在哪里了。这方面的文档或明确的最佳实践似乎还比较缺乏 。
  • 重要性: 理解这一点很重要,因为 Wait + Form 是实现人工审批流程的常用模式。如果无法可靠地获取审批人的输入(比如“同意”还是“拒绝”),后续的逻辑就无法正确执行。

常用应用场景

n8n 表单节点让人机协作成为可能,以下是一些翔宇觉得非常实用的场景:

场景一:多步审批流程 (如请假、报销)

  • 流程:
    1. n8n Form Trigger: 员工填写并提交请假申请表单(包含请假类型、时间、事由)。
    2. Data Formatting / Calculation Node: (可选) 计算请假时长,查询员工剩余假期等。
    3. Email / Notification Node: 向员工的直属主管发送邮件或 IM 通知,告知有新的审批请求,并附带一个链接。这个链接指向 Wait 节点 的恢复 URL ({{ $execution.resumeFormUrl }})。
    4. Wait Node:
      • Resume: On Form Submitted
      • Form Elements: 显示请假详情(只读,可用 Custom HTML 或预填的 Text 字段),提供审批选项(如 Dropdown: 同意 / 拒绝),以及一个审批意见的 Textarea。
    5. (Wait 节点之后)​IF / Switch Node: 根据 Wait 节点表单提交的审批结果 ($resumeData.审批选项? 需要确认如何访问) 进行分支:
      • 分支一 (同意): 更新数据库状态,通知 HR,通知申请人结果。
      • 分支二 (拒绝): 更新数据库状态,通知申请人结果(附带拒绝理由)。
  • 价值: 将线下的、邮件传来传去的审批流程,搬到线上自动化,流程清晰,状态可追溯 。

场景二:动态任务分配与确认

  • 流程:
    1. Webhook / Trigger: 接收到一个新的客服工单。
    2. Database / API Node: 查询当前在线且技能匹配的技术支持人员列表。
    3. n8n Form Node (Define Form):
      • Custom HTML: 显示工单的简要信息。
      • Dropdown List:字段标签 为 “选择处理人”,Options 通过表达式动态加载查询到的技术支持人员列表 ({{ $json.availableAgents.map(agent => ({ label: agent.name, value: agent.id })) }})。
      • Textarea: (可选) 补充说明。
    4. (Form 节点之后)​API / Notification Node: 获取客服选择的处理人 ID ($json.选择处理人),将工单信息推送给该处理人,并更新工单状态。
  • 价值: 在自动化分配任务的基础上,加入人工选择环节,确保任务分配得更合理。

场景三:数据清洗与校验的人工干预

  • 流程:
    1. Data Source Node (e.g., Read Spreadsheet, API Call): 获取一批原始数据。
    2. Function / Code Node: 对数据进行自动校验,标记出格式错误、逻辑可疑或信息缺失的数据。
    3. SplitInBatches / IF Node: 将需要人工处理的数据筛选出来。
    4. n8n Form Node (Define Form – executed for each problematic record):
      • Custom HTML: 显示原始数据记录的关键信息。
      • Text / Number / Date Fields: 提供输入框,预填原始数据中对应的值 ({{ $json.originalValue }}), 并高亮标记出问题字段,让用户可以直接修改。
      • Dropdown List: (可选) 提供一些快速修复选项,如 “标记为无效”, “忽略此错误”。
    5. (Form 节点之后)​Database Update / API Call Node: 使用用户修正后的数据 ($json.correctedValue) 更新回源系统,或根据用户的选择执行相应操作。
  • 价值: 将自动化数据处理与人工校验相结合,提高数据质量,处理自动化无法解决的模糊或异常情况。

场景四:生成报告前的动态参数选择

  • 流程:
    1. Manual Trigger / Webhook: 用户手动触发一个报告生成工作流。
    2. n8n Form Node (Define Form):
      • Date Fields: 让用户选择报告的开始日期和结束日期。
      • Dropdown List / Checkbox Group: 让用户选择报告要包含的数据维度或产品线(选项可以从数据库动态加载)。
      • Dropdown List: 选择报告输出格式 (PDF / Excel)。
    3. (Form 节点之后)​Database Query / API Call Node: 根据用户在表单中选择的参数 ($json.startDate, $json.endDate, $json.dimensions, $json.format),动态构建查询语句或 API 请求。
    4. Report Generation Node (e.g., Spreadsheet File, Function to generate PDF): 生成报告。
    5. Email / Download Response Node: 将生成的报告发送给用户或提供下载。
  • 价值: 让用户可以按需定制报告内容,提供更灵活、个性化的数据服务。

常见报错及解决方案

在使用 n8n Form 和 Form Trigger 时,可能会遇到一些常见问题。

错误:表单无法显示 / URL 无效 / 404 Not Found

  • 现象: 访问表单 URL 时,浏览器显示错误页面,或者提示找不到页面。
  • 原因与解决方案:
    • 检查是否以 Form Trigger 开始: 确保你的工作流是以 n8n Form Trigger 节点作为 第一个 节点启动的。只有 Trigger 节点才能生成初始的、可访问的表单 URL。
    • 检查 URL 是否正确: 你访问的是 Test URL 还是 Production URL?
      • Test URL: 只能在 n8n 编辑器中通过点击 “Test Workflow” 或 “Test Step” 启动测试时才能访问。直接在浏览器里打开 Test URL 通常是无效的。
      • Production URL: 必须在工作流 保存 并且 激活 (Active) 之后才能访问。如果工作流未激活,访问 Production URL 会报 404。
    • 检查自定义路径 (Form Path): 如果你在 Trigger 节点配置了自定义的 Form Path,确保你访问的 URL 中包含了这个路径,例如 https://n8n.example.com/form/your-custom-path。
    • 检查 n8n 服务状态: 确认你的 n8n 服务正在运行,并且可以通过配置的域名或 IP 地址从你的浏览器访问到。检查防火墙或反向代理设置是否正确。

错误:提交表单后工作流不执行 / 卡住 / 报错

  • 现象: 用户在表单页面填写并提交了数据,但后续的工作流步骤没有按预期执行,或者某个节点报错。
  • 原因与解决方案:
    • 检查后续节点配置: 仔细检查紧跟在 Form Trigger 或 n8n Form 节点 之后 的那个节点的配置。它是否能正确处理表单输出的数据?它的参数是否配置正确?
    • 检查数据引用表达式: 在后续节点中,你用来访问表单数据的表达式(如 $json.fieldName)是否写对了?字段名是否与表单中定义的 字段标签 或 Element Name 匹配?(注意大小写和特殊字符转换)。
    • 查看执行日志 (Executions): 这是排查问题的关键。去 n8n 界面的 “Executions” 页面,找到对应的执行记录,点击查看详情。你可以看到每个节点的输入、输出数据以及错误信息(如果有的话)。这能帮你定位问题出在哪个节点以及具体原因。
    • 区分测试与生产模式: 如果你在测试模式 (Test Workflow) 下运行正常,但在生产模式 (Active workflow) 下有问题,检查是否有环境相关的差异(比如环境变量、凭证权限等)。生产模式下提交表单后,数据流不会实时显示在编辑器里,你需要去 Executions 页面查看。

错误:无法访问 Wait 节点中表单提交的数据

  • 现象: 如前所述,在使用 Wait 节点配合 On Form Submitted 时,后续节点可能无法通过 $json.fieldName 获取到 Wait 表单的输入 。
  • 原因: Wait 节点的恢复机制可能将数据存储在不同的上下文中 。
  • 解决方案:
    1. 尝试 $resumeData: 在后续节点中,尝试使用 $resumeData.fieldName 或类似的表达式来访问数据。你需要实验或查找最新的文档/社区讨论来确定确切的变量名。
    2. 检查 Wait 节点输出: 在 Executions 视图中,仔细检查 Wait 节点 恢复后 的输出数据结构,看表单数据被放在了哪个层级下。
    3. 社区/文档求助: 在 n8n 社区搜索或提问,看是否有关于访问 Wait 节点恢复数据的最佳实践或已知问题。
    4. 变通方案: 考虑在 Wait 节点 ​内部​(如果其配置允许)或者紧随其后加一个 Set 节点,尝试将恢复数据显式地存到一个更容易访问的字段中。

错误:表单样式不满足需求 / 无法实现复杂功能 (如条件逻辑、重复区段)

  • 现象: 你想让表单更好看,或者实现一些高级的交互功能,但发现内建的 Form 节点选项不够用 。
  • 原因: n8n Form 节点设计目标是提供基础的交互能力,而非取代专业的表单构建工具或前端框架。
  • 解决方案:
    1. 调整预期: 认识到内建节点的局限性,对于简单交互和数据收集,它足够好用。
    2. 有限利用 Custom HTML: 可以用它嵌入说明、图片、视频等内容,但不要期望用它来重构整个表单布局或样式 。
    3. 嵌入外部表单 (推荐用于复杂场景):
      • 使用你熟悉的前端技术或在线表单工具(如 Vue, React, Typeform, Google Forms 等)来构建你的复杂表单界面。
      • 将这个外部表单的提交目标 (action URL) 设置为一个 n8n 的 Webhook 节点的 URL。
      • 这样,用户在你的漂亮表单上提交数据后,数据会发送给 n8n Webhook,触发后续的自动化流程。n8n 只负责处理后端逻辑。
    4. 修改模板 (高风险,需自托管): 如社区帖子 提到的,有经验的用户可以在自托管的 n8n 环境中,找到并修改 form-trigger.handlebars 这个模板文件,注入自定义的 CSS 或 JavaScript 库(比如用于电话号码格式化的 intl-tel-input )。但这需要懂前端技术,了解 Handlebars 模板,并且操作有风险(可能影响 n8n 升级,改坏了表单无法显示等)。不推荐新手尝试。
    5. 寻找社区节点: 关注 n8n 社区,看是否有开发者发布了功能更强的表单相关节点。

注意事项

最后,使用 n8n 表单功能时,请注意以下几点:

  • Trigger 与 Form 的配合: 再次强调,一个完整的、从头开始的表单流程,必须由 n8n Form Trigger 启动。n8n Form 节点用于后续步骤。
  • URL 管理: 严格区分 Test URL 和 Production URL 。Test URL 用于开发调试,需要配合 n8n 编辑器中的测试运行功能。Production URL 用于已激活的、实际运行的工作流。不要混淆,也不要在生产环境中依赖 Test URL。
  • 安全性:
    • 敏感信息: 如果你的表单收集用户的敏感信息(如密码、身份证号、银行信息等),你需要确保你的 n8n 实例部署在安全的环境中,并且考虑传输过程的加密(使用 HTTPS)。
    • 公开表单: 如果你的表单可以通过 Production URL 公开访问,要意识到可能收到垃圾信息或被恶意提交。可以考虑在 Form Trigger 的节点选项中开启 “Ignore Bots” ,但这不能完全杜绝。对于关键业务,可能需要加入验证码、访问频率限制等更强的防护措施(通常需要在 n8n 外部实现,比如通过反向代理)。
  • 用户体验 (UX): 设计表单时,站在用户的角度思考:
    • 问题是否清晰明确?(字段标签)
    • 是否有必要的说明?(字段描述 或 Custom HTML)
    • 是否合理使用了必填项?(Required Field)
    • 多步表单的流程是否逻辑清晰?每一步的任务是否过重?
    • 按钮文字是否清晰?(Button Label) 良好的用户体验能提高表单的完成率和数据质量。
  • 功能限制: 牢记 n8n 内建表单的功能边界 。对于超出其能力范围的复杂需求,及时考虑替代方案(如嵌入外部表单)。
  • Wait 节点集成: 如果将 Form 与 Wait 节点结合使用,特别注意如何访问 Wait 表单提交的数据,这可能需要额外的探索或参考最新的社区实践 。
  • 版本兼容性: n8n 的表单功能也在不断发展中。新版本可能会引入新的字段类型、配置选项或改进 UI。建议关注 n8n 的更新日志,并参考你所使用版本对应的官方文档。

n8n 表单节点为你打开了自动化与人交互的大门。灵活运用它,可以让你的工作流更加智能和人性化。

结尾

总结回顾与实践的力量

恭喜你!坚持学习完了这篇关于 n8n 中 Compression, Edit Image, FTP 和 n8n Form 四个核心节点的深度教程。我们一起从零开始,探索了:

  • 如何使用 Compression 节点 轻松地打包和解开压缩文件,让文件管理和传输更高效。
  • 如何利用 Edit Image 节点 在工作流中直接处理图片,实现调整尺寸、添加水印、转换格式等自动化操作(当然,也了解了 GraphicsMagick 这个重要的“幕后英雄”)。
  • 如何通过 FTP 节点 安全地连接并操作 FTP/SFTP 服务器,实现与传统文件系统的无缝对接。
  • 如何运用 n8n Form 节点 和 Form Trigger 节点 构建交互式的网页表单,让你的自动化流程能够收集用户输入、获得决策,实现人机协作。

翔宇在这里想再次强调的是,理论学习是打下基础,但 ​真正的掌握来自于动手实践​。n8n 最棒的一点就是它的可视化界面和强大的测试功能,它们就是为了鼓励你去大胆尝试、不断试错而设计的。

所以,不要仅仅停留在阅读。打开你的 n8n,把教程中的例子跑起来,试着修改参数看看效果,尝试把这些节点组合起来解决你身边的一个小问题。比如,能不能自动把下载的图片加个水印再存到 FTP?能不能创建一个表单让同事提交周报,然后自动压缩打包发送给你?

从这些简单的场景开始,一步步搭建你自己的自动化工作流。你会发现,这些看似独立的节点,组合起来能爆发出巨大的能量,帮你解决工作中那些重复、繁琐、耗时的任务,把你的时间和精力解放出来,去做更有价值、更有创造性的事情。这就是自动化的魅力所在!

Total
0
Shares
Tweet 0
Share 0
翔宇工作流

专注于AI与自动化技术的分享与实践 翔宇微信:xiangyugzl

相关话题
  • n8n教程
上一篇文章
  • n8n中文教程

n8n 中文教程:代码 (Code)与执行命令 (Execute Command)

  • 翔宇工作流
  • 2025年5月5日
阅读
下一篇文章
  • n8n中文教程

n8n 中文教程:AI 代理(AI Agent)

  • 翔宇工作流
  • 2025年5月5日
阅读
你可能会喜欢
阅读
  • AI自动化工作流

n8n 31.效率翻10倍!n8n+MCP实操指南:极速接入上百AI大模型秒出风格化图片

  • 翔宇工作流
  • 2025年5月7日
阅读
  • AI自动化赚钱

翔宇工作流:SEO文章标题撰写全攻略(3 万字)

  • 翔宇工作流
  • 2025年5月7日
阅读
  • n8n中文教程

n8n 中文教程:情感分析 、信息提取与文本分类

  • 翔宇工作流
  • 2025年5月6日
阅读
  • n8n中文教程

n8n 中文教程:基础 LLM 链 ​、摘要链与问答链

  • 翔宇工作流
  • 2025年5月6日
阅读
  • n8n中文教程

n8n 中文教程:Sort、Rename Keys、Compare Datasets、Crypto

  • 翔宇工作流
  • 2025年5月5日
阅读
  • n8n中文教程

n8n 中文教程:HTTP 请求 (HTTP Request)

  • 翔宇工作流
  • 2025年5月5日
阅读
  • n8n中文教程

n8n 中文教程:AI 代理(AI Agent)

  • 翔宇工作流
  • 2025年5月5日
阅读
  • n8n中文教程

n8n 中文教程:代码 (Code)与执行命令 (Execute Command)

  • 翔宇工作流
  • 2025年5月5日

发表回复 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

搜索
分类
  • AI自动化工作流 (35)
  • AI自动化赚钱 (29)
  • Make中文教程 (7)
  • n8n中文教程 (22)
  • 翔宇教程 (31)
精选文章
  • 1
    n8n 31.效率翻10倍!n8n+MCP实操指南:极速接入上百AI大模型秒出风格化图片
  • 2
    福利来啦 | 手把手教你领取 $10 大模型免费额度
  • 30. 终极RAG副业系统上线!0代码自动处理任意文档 3
    n8n 30. n8n RAG 全自动知识库副业工作流,轻松月入过万?
  • 4
    n8n 会员独家:n8n 图片上传免费图床 Cloudinary 工作流
  • 我用n8n搭建了一套自动化赚钱系统 5
    n8n 29.n8n自动化赚钱全流程拆解:小白也能做的副业系统
目录 隐藏
1 引言
2 压缩节点 (Compression)
3 编辑图像节点 (Edit Image)
4 FTP 节点 (FTP)
5 n8n 表单节点 (n8n Form)
6 结尾
翔宇工作流
  • 小报童
  • Buy Me A Coffee
  • 翔宇Notion知识库
  • RSS订阅源
  • 隐私政策
© 2025 翔宇工作流 | 专注于AI与自动化技术的分享与实践 | All rights reserved

输入搜索关键词,按回车搜索。