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

