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

如何在Golang中解析multipart/form-data里的嵌套JSON?

解析multipart/form-data请求中的嵌套JSON时遇到的问题

我正在尝试解析包含文件和嵌套JSON数据的请求,目标JSON格式如下:

{data: {"date_required":null}}

最初未记录完整错误,补充后的错误日志如下:

2023/11/17 23:40:35 error in decoding request body data
2023/11/17 23:40:35 invalid character '.' looking for beginning of value

我怀疑错误源于表单数据不符合标准JSON格式,但不知道具体修复方法。Flutter客户端代码看起来发送的是合法JSON,请求的Content-Type为multipart/form-data——文件上传功能必须使用该类型。

Flutter客户端请求代码

final multipartFile =
    http.MultipartFile.fromBytes('file', bytes, filename: file?.name);

final request = http.MultipartRequest('POST', Uri.parse(user.fileUrl));

request.files.add(multipartFile);

request.headers.addAll(headers);

String dateRequiredStr = dateRequired != null
    ? jsonEncode({'date_required': dateRequired})
    : jsonEncode({'date_required': null});

request.fields['data'] = dateRequiredStr;

Golang API相关代码

模型定义(已修改)

type FileRequiredDate struct {
    DateRequired pgtype.Date `json:"date_required"`
}

type FileRequiredDateData struct {
    Data FileRequiredDate `json:"data"`
}

业务处理代码

func (rs *appResource) uploadTranscriptAudioFile(w http.ResponseWriter, r *http.Request) {

start := time.Now()

const maxUploadSize = 500 * 1024 * 1024 // 500 Mb

var requiredByDate FileRequiredDateData

decoder := json.NewDecoder(r.Body)

err := decoder.Decode(&requiredByDate)

if err != nil {
    log.Println("error in decoding request body data")
    log.Println(err.Error())
    http.Error(w, err.Error(), http.StatusBadRequest)
    return
}

file, handler, err := r.FormFile("file")

if err != nil {
    log.Println(err)
    http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
    return
}

defer file.Close()

fileSize := handler.Size

if fileSize > maxUploadSize {
    http.Error(w, "FILE_TOO_BIG", http.StatusBadRequest)
    return
}

fileName := handler.Filename

通过httputil.DumpRequest已确认请求的Content-Type为multipart/form-data。

参考相关问题修改代码后,日志可以输出data和file,但必须将json.NewDecoder(r.Body)替换为json.NewDecoder(part)才能修复JSON解析问题;但修改后又出现error getting form file错误,无法获取上传的文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 02:34:53