因为mongofiles put只接受单个文件路径,不支持目录;传入文件夹路径时系统报“Is a directory”错误,需用shell脚本或PowerShell遍历文件逐个上传,并显式指定--local源路径和目标filename。

mongofiles put 为什么报 “Is a directory” 错误
因为 mongofiles put 只接受单个文件路径,不支持目录。当你直接传入文件夹路径(比如 /path/to/dir),它会尝试打开该路径作为文件,而系统返回 error: cannot open file: /path/to/dir (Is a directory)。
常见误操作:写成 mongofiles put /my/folder 或漏掉 --local 参数却以为能自动识别子文件。
- 必须显式指定每个待上传文件的完整路径(含扩展名)
- Linux/macOS 下用
find /path -type f -print0 | xargs -0 -I {} mongofiles --db mydb put {}可规避空格和换行问题 - PowerShell 中推荐:
Get-ChildItem -Recurse -File | ForEach-Object { mongofiles --db mydb --host localhost:27017 put $_.FullName }
上传时怎么控制 filename 和 chunkSize
mongofiles 对 filename 的控制仅限于重命名——用 --local 指定源路径,命令末尾的参数才是 GridFS 中的 filename 字段值。例如:mongofiles --local ./report_v2.pdf put invoice.pdf 会让 GridFS 存下 filename: "invoice.pdf",但内容来自 report_v2.pdf。
--chunkSize 可设,但有硬性限制:必须是 255KB 的整数倍(即 261120 字节的倍数),且最小为 1 倍。例如:--chunkSize 524288 表示 512KB。
- 不加
--db时,默认写入test数据库 -
--prefix可改默认集合前缀(如fs→assets),对应生成assets.files和assets.chunks - metadata 和自定义 _id 完全无法通过
mongofiles设置,必须用驱动(PyMongo/Node.js)
上传失败最常见的三个原因
批量上传卡住或中断,优先排查这三项:
-
connection refused或auth failed:确认--host地址、端口(默认27017)、--username/--password和--authenticationDatabase是否匹配服务端配置;MongoDB 6.0+ 默认启用 SCRAM-SHA-256,旧版mongofiles(如 4.x)可能握手失败 -
file already exists:put默认不覆盖,必须加--replace(注意:这是先删后传,非增量更新) - 大文件上传中途断开:GridFS 不提供断点续传,残留的 chunks 需手动清理——查
fs.chunks中files_id对应未完成的文档,再删掉fs.files中同_id的元数据
为什么不能靠 mongofiles 实现分片上传
GridFS 本身没有“上传中”状态、chunk 校验或顺序保障机制。mongofiles 是单次完整文件上传工具,它内部把整个文件读入内存再切块写入,不暴露 chunk 级接口。
所谓“分片上传”,必须由客户端自行拆分、编号(n 字段从 0 开始严格递增)、逐个写 fs.chunks,最后补 fs.files 文档。MongoDB 不校验 chunk 顺序,也不阻止乱序写入——这意味着并发写 chunk 极易拼错文件,必须串行或强依赖 n 字段计算逻辑。
容易被忽略的一点:fs.files.length 必须等于实际字节数,且 fs.chunks 中所有 n 连续无缺,否则驱动(如 PyMongo 的 gridfs_bucket.open_download_stream())会静默失败或返回损坏内容。


















