如何在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
相关产品推荐
相关产品推荐

