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

如何用Go发送包含嵌套对象字段的multipart文件上传POST请求

你直接把curl里对应的表单字段名字符串原样传入CreateFormFile的第一个参数即可,嵌套结构的点号、数组下标符号都不需要额外转义或特殊处理,multipart表单的字段名本身就是纯字符串,嵌套/数组语义是服务端解析时的约定,客户端只需要按要求传递字段名即可。

完整实现代码如下:

package main

import (
	"bytes"
	"io"
	"mime/multipart"
	"net/http"
	"os"
)

func main() {
	// 初始化multipart缓冲区和写入器
	var requestBody bytes.Buffer
	writer := multipart.NewWriter(&requestBody)

	// 写入普通表单字段 name=function
	err := writer.WriteField("name", "function")
	if err != nil {
		panic(err)
	}

	// 打开待上传的本地文件
	file, err := os.Open("my_file.lua")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	// 直接使用curl里的字段名 "config.file[1]" 作为CreateFormFile的第一个参数
	fileWriter, err := writer.CreateFormFile("config.file[1]", "my_file.lua")
	if err != nil {
		panic(err)
	}
	// 将本地文件内容拷贝到表单写入流
	_, err = io.Copy(fileWriter, file)
	if err != nil {
		panic(err)
	}

	// 关闭multipart写入器,补全最后的结束分隔符
	err = writer.Close()
	if err != nil {
		panic(err)
	}

	// 构造POST请求
	req, err := http.NewRequest("POST", "http://localhost:8001/routes/route_name", &requestBody)
	if err != nil {
		panic(err)
	}
	// 设置正确的Content-Type,自动携带multipart边界标识
	req.Header.Set("Content-Type", writer.FormDataContentType())

	// 发送请求
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	// 此处可按需处理响应结果
	// respContent, _ := io.ReadAll(resp.Body)
	// println(string(respContent))
}

如果需要上传config.file数组的多个元素,只需要依次调用CreateFormFile,分别传入config.file[0]、config.file[1]这类对应下标的字段名即可,和curl中多次传入-F config.file[N]=@文件路径的逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 19:06:01