🎶

【Go】複数のファイル(MultipartForm)をリクエストから取得する

2021/11/08に公開

概要

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