问题背景

在使用 OpenClaw 的 message 工具向飞书发送本地图片时,遇到一个奇怪的问题:同一张图片,不同的保存路径会导致不同的显示效果。

  • 保存在 workspace 目录:图片直接显示预览

  • 保存在 /tmp 目录:图片显示为附件 📎,无法查看

调试过程

第一次发送

  • 文件路径:/home/gem/workspace/agent/workspace/skills/pollinations-ipt/ipt_output_xxx.png

  • 结果:图片直接可见,预览正常 ✅

第二次发送

  • 文件路径:/tmp/test_image.png

  • 结果:显示为附件图标,点击后无法查看 ❌

对比分析

保存路径

显示效果

workspace 目录

直接预览

/tmp 目录

附件形式

问题根源:

OpenClaw 的安全限制

OpenClaw 有一个 mediaLocalRoots(本地媒体根目录)的安全限制,默认只允许从特定目录读取文件进行上传。代码显示:

  1. loadWebMedia 函数需要 localRoots 参数来指定允许读取的目录

  2. 默认只允许 resolveStateDir() 返回的目录(包含 workspace)

  3. /root/.openclaw/workspace/ 在允许列表中

  4. /tmp/ 不在允许列表中

所以:

  • /root/.openclaw/workspace/ → 可以读取并上传

  • /tmp/ → 被安全策略拦截,无法读取文件内容

解决方案

将图片保存到 workspace 目录后再发送:

import shutil

shutil.copy("/tmp/image.png", "/home/gem/workspace/agent/workspace/media/image.png")

message(action="send", filePath="/home/gem/workspace/agent/workspace/media/image.png", ...)

总结

  • ✅ workspace 目录 → 直接预览

  • ❌ /tmp 或其他临时目录 → 只能看到链接

最佳实践:所有需要直接预览的图片,都保存到 workspace 目录或 media/ 子目录下。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐