Newman 不支持 multipart/form-data 文件上传,因其无法读取本地文件构造二进制 body,导出的 collection JSON 中 src 字段被完全忽略;唯一可行方案是预转 base64 并在 pre-request script 中还原,或改用 curl/Python 脚本处理上传。

Postman 本身不支持在 Newman 中直接执行带文件上传(multipart/form-data)的请求 —— 这是硬限制,不是配置问题。Newman 无法读取本地磁盘文件并构造二进制 body,所有 form-data 类型的键值对在导出为 collection JSON 后,都会丢失文件路径和二进制内容,只保留字段名和占位符。
为什么 newman run 会跳过文件上传字段
Postman 导出的 collection JSON(v2.1)中,form-data 字段被序列化为类似这样的结构:
{
"key": "file",
"value": "",
"type": "file",
"src": "/Users/me/test.pdf"
}
但 Newman 在运行时完全忽略 src 字段 —— 它既不会校验路径是否存在,也不会尝试读取文件,而是把该字段当作空字符串或 null 处理。这是官方明确声明的行为(见 Newman GitHub issue #2498 和 Postman 文档 “Limitations” 章节)。
- 即使你手动修改 JSON 把
src改成相对路径(如"./testdata/test.pdf"),newman 仍不识别 -
-d参数只支持 CSV/JSON 数据驱动,不能注入二进制内容 -
--global-var或--env-var只能传字符串,无法传文件句柄或 base64 blob
可行的绕过方案:用 base64 预编码 + pre-request script 拼接
如果你必须用 Newman 运行含上传逻辑的集合,唯一稳定路径是:把文件提前转成 base64 字符串,通过 -d 注入,再在 Postman 的 pre-request script 中还原为二进制 blob 并赋给 form-data 字段。
Postman Mac版是一款专为macOS设计的API开发与测试工具,凭借简洁的界面和强大的功能,深受开发者喜爱。它支持发送各种HTTP请求(GET、POST、PUT等),轻松管理接口集合、环境变量和模拟服务器。Mac用户可享受原生性能、快捷键优化及与系统无缝集成的体验,适用于接口调试、自动化测试和文档生成。无论是个人项目还是团队协作,Postman for Mac都能提升API开发效率,是ma
- 准备阶段:用命令行将文件转 base64(Linux/macOS):
base64 -i test.pdf | tr -d '\n' > test.b64 - CSV 数据文件
upload.csv内容示例:filename,file_b64 test.pdf,JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC...
- 在 Postman 请求的 Pre-request Script 中写:
const fileB64 = pm.iterationData.get("file_b64"); const blob = pm.environment.set("upload_blob", fileB64); // 仅作透传 - 在 Body → form-data 中,
file字段的值设为:{{upload_blob}},类型保持text(⚠️不能选file) - 最终 Newman 命令:
newman run upload.postman_collection.json -d upload.csv
注意:后端必须能接受 base64 编码的文件体(即不做 MIME 解析,直接 base64_decode 后存盘),否则会报错或损坏文件。
更推荐的替代做法:改用 curl 或 Python 脚本
对真实文件上传场景,强行塞进 Newman 反而增加维护成本。建议分层处理:
- 用 Postman + Newman 负责纯 API 流程(鉴权、状态流转、断言)
- 把上传动作拆出来,用
curl单独调用:curl -F "file=@test.pdf" -F "token=xxx" https://api.example.com/upload - 或用 Python +
requests写轻量脚本,复用 Postman 导出的环境变量 JSON:import json, requests env = json.load(open("../env/prod.json")) files = {"file": open("test.pdf", "rb")} r = requests.post("https://api.example.com/upload", headers={"Authorization": env["values"][0]["value"]}, files=files)
这样既避开 Newman 的限制,又能保证上传行为可调试、可复现、可集成到 CI。
真正容易被忽略的点是:很多人花几小时调 newman -e 和 -d 参数,却没意识到 Newman 根本不碰文件系统 —— 它的设计定位就是“运行已序列化的请求逻辑”,而非“模拟完整浏览器行为”。上传这件事,从一开始就不在它的能力边界内。
















