🎶
【Go】複数のファイル(MultipartForm)をリクエストから取得する
概要
JavaScriptではmultipart/form-data
形式で、複数のファイルをアップロードすることができます。 実装例としては複数画像をまとめてアップロードして順にフォームリクエストするの記事が参考になります。
ではサーバサイド側でGolangを使用した場合、この複数ファイルの形式をどう受け取れば良いのか、というのをメモ書きします。
対応
こちらのstackoverflowの記事にある通り、リクエストのMultipartForm
のプロパティから複数のfilHeaderが取得できます。このfilHeaderからfileを抽出していくことで、複数ファイルを取得することができます。
実装サンプル
以下のサンプルで、上記のstackoverflowの記事と異なる点として、requestはginのcontextから取得している点、ファイルが格納されているリクエストの変数名を変数名[]
としている点です。このような変数名としている理由は、JavaScript側で複数ファイルをロジックで格納する際、変数名を配列形式にしないと上手く認識してくれなかった為です。
// GetMultipartFiles 複数ファイルの取得
func GetMultipartFiles(c *gin.Context, propertyName string) ([]multipart.File, []*multipart.FileHeader, error) {
err := c.Request.ParseMultipartForm(32 << 20)
if err != nil {
return nil, nil, err
}
formdata := c.Request.MultipartForm
filHeaders := formdata.File[propertyName+"[]"]
var files []multipart.File
for _, h := range filHeaders {
file, err := h.Open()
if err != nil {
return nil, nil, err
}
files = append(files, file)
}
return files, filHeaders, nil
}
Discussion