How to set Content-Type for a form filed using 'multipart' in Go

go, multipartform-data

Solution

Looking at the source code mime/multipart it's not possible, but you could implement something like this (note: it's not handling the escaping of filename correctly)

    func CreateAudioFormFile(w *multipart.Writer, filename string) (io.Writer, error) {
      h := make(textproto.MIMEHeader)
      h.Set("Content-Disposition", fmt.Sprintf(`form-data; name="%s"; filename="%s"`, "file", filename))
      h.Set("Content-Type", "audio/wav;rate=8000")
      return w.CreatePart(h)
}

Outputs

--0c4c6b408a5a8bf7a37060e54f4febd6083fd6758fd4b3975c4e2ea93732 Content-Disposition: form-data; name="file"; filename="helloWorld.wav" Content-Type: audio/wav;rate=8000 --0c4c6b408a5a8bf7a37060e54f4febd6083fd6758fd4b3975c4e2ea93732--

See playground for full example.

Edit: To write the file data, also copy it to the writer as in the original example.

audioFile, _ := CreateAudioFormFile(writer2, "helloWorld.wav")
io.Copy(audioFile, file)

See updated playground for the full example that includes the file data.

Problem

I am attempting to upload a file that requires me to set a specific Content-Type for the API. When I do this: ``` file, err := os.Open("helloWorld.wav") buf := new(bytes.Buffer) writer := multipart.NewWriter(buf) audioFile, _ := writer.CreateFormFile("file", "helloWorld.wav") _, err = io.Copy(audioFile, file) if err != nil { return nil, 0, err } writer.Close() ``` It creates the multipart form properly, but assumes this content type: ``` Content-Type: application/octet-stream ``` I need to be able to set it to: ``` Content-Type: audio/wav;rate=8000 ``` While of course I may set the headers for net/http, I am not seeing how to do this for individual fields in a multipart form.

Original source