はじめに
個人的なメモが目的。
よくある実装
body := new(bytes.Buffer)
multipartWriter := multipart.NewWriter(body)
fileWriter, _ := multipartWriter.CreateFormFile(fieldName, fileName)
_, _ = io.Copy(fileWriter, file)
ただ、これだとファイルを受け取った側で Content-Type: application/octet-stream
となってしまい、Content-Typeを判断することができない。
解決案
Golangの内部の実装を参考にやってみた。
body := new(bytes.Buffer)
multipartWriter := multipart.NewWriter(body)
contentType := func() string {
defer func() {
_ = file.Seek(0, 0)
}()
fileData, err := ioutil.ReadAll(file)
if err != nil {
return "application/octet-stream"
}
return http.DetectContentType(fileData)
}()
header := make(textproto.MIMEHeader)
header.Set("Content-Disposition",
fmt.Sprintf(`form-data; name="%s"; filename="%s"`, fieldName, fileName))
header.Set("Content-Type", contentType)
part, _ := multipartWriter.CreatePart(header)
_, _ = io.Copy(part, file)
最後に
他にいい方法あったらコメントお願いします。