postman上传图片必须用form-data而非raw+json,因json无法传输二进制文件;需确保key名与后端c.formfile("xxx")完全一致,并正确选择file类型上传,否则文件为空。

Postman 必须用 form-data,不能用 raw + JSON
直接在 Postman 的 Body 里选 raw 并填 JSON,上传一定会失败——因为文件二进制数据无法被 JSON 编码传输。multipart/form-data 是唯一能同时传文件+字段的合法格式。错误现象通常是后端 c.FormFile("file") 返回 nil 或报错 http: no such file。
正确做法:
- Body → 选择
form-data - Key 栏填你后端代码里
c.FormFile("xxx")的参数名(比如file、upload、avatar) - Value 栏右侧下拉菜单选
File,再点右侧Select Files按钮选本地文件 - 不要手动填 Key 的 Content-Type;Postman 会自动加正确的
boundary和头
后端 c.FormFile() 的 key 名必须和 Postman 的 key 完全一致
这是最常踩的坑:Postman 填了 file,但后端写的是 c.FormFile("myfile"),结果拿不到文件头,file 变成 nil,后续 c.SaveUploadedFile(file, ...) 直接 panic 或静默失败。
检查方式:
- 打印所有表单 key:
keys := c.Request.MultipartForm.Value; fmt.Printf("form keys: %+v\n", keys) - 或直接用
c.ShouldBind(&struct{ File *multipart.FileHeader `form:"file"` })配合结构体绑定验证 - 注意大小写和空格——
File和file是两个不同 key
c.SaveUploadedFile() 路径要可写,且目录需提前存在
c.SaveUploadedFile(file, "./uploads/" + file.Filename) 看似简单,但实际运行时容易卡在两处:
-
./uploads/目录不存在 → 报错open ./uploads/xxx.png: no such file or directory - 当前进程没有写权限(比如部署到 Linux 服务器用非 root 用户运行)→ 报错
permission denied
建议改用显式创建目录:
os.MkdirAll("./uploads", 0755)
c.SaveUploadedFile(file, "./uploads/"+file.Filename)
另外,file.Filename 是客户端传来的原始文件名,不可信——可能含 ../ 路径穿越,生产环境务必做白名单校验或重命名。
调试时别只看返回状态码,要读响应体和日志
Postman 显示 200 OK 不代表文件真存进去了。常见假成功场景:
- 后端逻辑里
c.SaveUploadedFile()失败但没return,继续执行c.JSON(200, ...) - 文件保存路径写错(比如写成
"./upload/"少了个s),实际保存到了别的地方甚至丢弃了 - Postman 自动把中文文件名 URL 编码,而 Go 默认按 UTF-8 解码,一般没问题;但某些旧版 Windows 客户端可能发 GBK 编码名,导致
file.Filename变乱码
上线前至少加一行日志:fmt.Printf("saved %s, size %d\n", file.Filename, file.Size),确认路径、大小、是否真触发了保存逻辑。











