办公文档
在 n8n 中处理文件/二进制数据及让 AI Agent…
当工作流涉及文件、图片、PDF、附件等二进制数据,或需要让 AI Agent 工具接收用户上传文件、返回生成文件时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在 n8n 中处理文件/二进制数据及让 特定
解决思路
- 记住二进制数据存放在 `$binary` 而非 `$json`,不要从 `$json` 读取文件内容。
- 理解每个 item 的结构:`json` 存放数据,`binary` 存放文件(典型键名为 `data`,可自定义),其中包含 base64 内容、`mimeType`、`fileName`、`fileExtension`;用 `$binary.<key>` 读取指定属性,多数文件处理节点有 `binaryPropertyName` 参数指定该键名。
- 在 Code 节点中生成二进制:返回 `{ json: {...}, binary: { data: { data: Buffer.from(content).toString('base64'), mimeType: 'text/plain', fileName: 'output.txt' } } }`。
- 在 Code 节点中读取二进制:用 `const buffer = await this.helpers.getBinaryDataBuffer(0, 'data')` 获取 Buffer,再如 `buffer.toString('utf-8')` 转文本;多数工作流无需直接读取,直接传给消费节点(邮件附件、文件上传等)即可。
- 处理 Agent 工具入站文件(用户上传→工具消费):先对上传文件做哈希生成 key 并上传到私有存储;把 key 注入 Agent 系统提示(如 "Files passed in: [{originalFileName, fileName}],调用工具时使用 EXACTLY 的 `fileName` 字段");工具用 `fromAi('imageName', '...', 'string')` 接收 key,子工作流再按 key 从存储下载。
- 处理 Agent 工具出站文件(工具生成→Agent 返回):工具内部生成二进制后上传到存储拿到 URL/key,返回 JSON 如 `{ ok: true, file_id: '...', url: '...' }`,由 Agent 在回复中嵌入 URL 或由另一工具按 key 获取;长耗时工具可用 webhook 异步变体。
- 当 JSON 变换(Edit Fields、Code、IF)剥离了二进制时,用 Merge 节点(by position)把变换后的 JSON 流与原始带二进制的流合并,使二进制保留下来,避免重新获取。
- 在聊天界面(Slack、Discord、Teams、Telegram、嵌入式 webhook chat 等)展示生成的图片时:先把图片上传到 CDN 或对象存储,再在消息中引用 URL(或使用平台原生文件上传 API),因为聊天界面不读取 `$binary`;存储由用户自行配置,常见选项有 S3、R2、GCS、Azure Blob、Vercel Blob、Supabase Storage 及 Dropbox、Google Drive、OneDrive、Box 等,应询问用户使用哪种而非默认 S3。
- 避免在 Code 节点中硬编码 base64 二进制内容,应通过 `$binary` 正确引用,或上传到存储后按 URL 引用。
- 注意 `passthroughBinaryImages: true` 只影响 LLM 能看到上传图片(用于视觉),并不会让工具接收到二进制,工具仍需走上传并传 key 的模式。
- Data Tables(表格存储)有独立技能 `n8n-data-tables-official`,涉及 schema、去重、持久状态时参考它。
适用边界 · 注意事项
- 当工作流完全不涉及文件、图片、附件等二进制数据时,无需使用本做法。
- 当需求是表格化持久存储(Data Tables 的 schema、去重、持久状态)时,应改用 n8n-data-tables-official 技能。
- 当无法配置外部存储/CDN 时,聊天界面图片嵌入等依赖 URL 的场景无法实现。