Gin初心者の画像アップロード
Gin初心者のためのファイルアップロード基礎
Ginフレームワークを使ってファイルアップロードを実装する際、まずはマルチパート(multipart)リクエストを正しく受け取ることが重要です。Ginはリクエストボディを自動でパースし、c.Request.MultipartFormに格納します。初心者はこの仕組みを理解し、c.FormFileを使って単一ファイルを取得する方法を覚えておくと、後の実装がスムーズになります。
c.FormFileとSaveUploadedFileで画像アップロード
画像アップロードの典型的なパターンは次のようになります。
func upload(c *gin.Context) {
file, err := c.FormFile("image")
if err != nil {
c.String(400, "ファイル取得失敗: %v", err)
return
}
// 画像の拡張子を検証
if !strings.HasSuffix(file.Filename, ".jpg") && !strings.HasSuffix(file.Filename, ".png") {
c.String(400, "許可されていない拡張子です")
return
}
// 保存先を決定
dst := path.Join("uploads", file.Filename)
if err := c.SaveUploadedFile(file, dst); err != nil {
c.String(500, "保存失敗: %v", err)
return
}
c.JSON(200, gin.H{"url": "/uploads/" + file.Filename})
}
ここで重要なのは、c.FormFileで取得したmultipart.FileHeaderをc.SaveUploadedFileに渡す点です。Ginは内部でストリームを読み取り、指定したパスにファイルを書き込みます。画像アップロードの場合、拡張子やサイズの検証を行うことでセキュリティを強化できます。
アップロード処理の検証とファイル保存のベストプラクティス
アップロード処理を安全に実装するためのポイントをまとめます。
- ファイルサイズ制限:
c.Request.BodyのContent-Lengthを確認し、許容範囲を超える場合は拒否します。 - 拡張子だけでなくMIMEタイプを検証:
http.DetectContentTypeで実際のバイナリを確認します。 - 保存先ディレクトリはWebサーバーの公開ディレクトリ外に置き、必要に応じて静的ファイルサーバーで配信します。
- ファイル名の衝突を防ぐため、UUIDやタイムスタンプを付与して一意にします。
- アップロード後は必ず検証(画像のリサイズやサニタイズ)を行い、悪意あるファイルが実行されないようにします。
これらの検証を組み合わせることで、Gin初心者でも安全かつ堅牢なファイルアップロード機能を構築できます。
コメント
コメントを投稿