8

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.

1 Answer 1

22

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.

Sign up to request clarification or add additional context in comments.

2 Comments

That works well for setting the field. But it is not clear to me how you add the file contents in that newly created field using net/textproto.
Updated with details, exactly the same as how you initially did it.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.