如何在同一请求中发布文件和表单字段?

时间:2018-11-22 16:44:06

标签: go http-post

我有以下代码,我试图将这些代码用于发送发布请求,以便将js.map文件上传到bugsnag。

...  
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
part, err := writer.CreateFormFile(filetype, filename)

if err != nil {
    log.Fatal(err)
}

fmt.Printf("Sending %s to bugsnag", filename)

io.Copy(part, file)
writer.Close()
request, err := http.NewRequest("POST", bugsnagUrl, body)

if err != nil {
    log.Fatal(err)
}

request.Header.Add("Content-Type", writer.FormDataContentType())

// This is where my problem seems to be, I can't add form values this way because the map is nil
request.Form.Add("apiKey", bugsnagToken)
request.Form.Add("minifiedUrl", fileurl)
request.Form.Add("sourceMap", filename)
request.Form.Add("overwrite", "true")
client := &http.Client{}

response, err := client.Do(request)

if err != nil {
    log.Fatal(err)
}
defer response.Body.Close()

上面的示例给出了以下错误

  

恐慌:在nil地图中为条目分配

     

goroutine 1 [运行中]:net / url.url.Values.Add(...)

我无法找到任何有关如何执行此操作的示例,我使用了有关如何从this question上传文件的示例。

我似乎能够发布文件,但是我如何发布文件,并在请求中包含发布表单值?

1 个答案:

答案 0 :(得分:1)

您应该添加这样的表单字段

writer.WriteField("apiKey", bugsnagToken)
writer.WriteField("minifiedUrl", fileurl)
writer.WriteField("sourceMap", filename)
writer.WriteField("overwrite", "true")
writer.Close()