You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

大文件(超10MB)上传报错Content type is not Multipart/Form-data排查

问题成因及解决方案

成因分析

  1. 中间代理(如Nginx)的上传大小限制:如果服务前端部署了Nginx这类代理,默认的client_max_body_size可能设置为10MB。当上传超过10MB的文件时,Nginx会直接截断请求,后端收到不完整的请求体后,MultipartReader()无法正确解析multipart格式,从而抛出Content type is not Multipart/Form-data的错误(实际是请求体不完整导致的解析失败,错误信息存在误导性)。
  2. 请求体完整性问题:大文件上传时,若客户端网络不稳定或请求发送异常,可能导致请求体传输不完整,同样会让MultipartReader()无法识别正确的multipart格式,触发错误。

解决方案

1. 调整中间代理的上传限制(若使用Nginx等)

找到Nginx的配置文件(如nginx.conf或站点专属配置文件),添加或修改client_max_body_size参数,设置为大于你允许的最大文件大小(比如和代码中一致的32MB):

client_max_body_size 32M;

修改后重启Nginx生效。

2. 优化代码的错误判断与处理

在调用MultipartReader()前,主动校验请求的Content-Type,避免依赖模糊的错误信息:

import "strings"

// 先校验Content-Type格式
contentType := r.Header.Get("Content-Type")
if !strings.HasPrefix(contentType, "multipart/form-data") {
    fmt.Println("server.go:FileUpload:Invalid Content-Type")
    return nil, fmt.Errorf("Content type is not Multipart/Form-data")
}

// 设置MaxBytesReader并获取MultipartReader
r.Body = http.MaxBytesReader(w, r.Body, 32<<20+1024)
reader, err := r.MultipartReader()
if err != nil {
    // 明确区分文件过大的错误
    if err == http.ErrRequestEntityTooLarge {
        fmt.Println("server.go:FileUpload:File exceeds maximum allowed size")
        return nil, fmt.Errorf("File size exceeds limit (max 32MB)")
    }
    fmt.Println("server.go:FileUpload:Error during MultipartReader:", err)
    return nil, err
}

3. 排查客户端上传逻辑

确认客户端上传时是否正确设置了Content-Type为multipart/form-data; boundary=xxx(通常由表单自动生成,无需手动设置),避免大文件上传时请求头被篡改。

内容的提问来源于stack exchange,提问作者Keerthi R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:22:43