スキップしてメイン コンテンツに移動

Gin初心者の画像アップロード

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.FileHeaderc.SaveUploadedFileに渡す点です。Ginは内部でストリームを読み取り、指定したパスにファイルを書き込みます。画像アップロードの場合、拡張子やサイズの検証を行うことでセキュリティを強化できます。

アップロード処理の検証とファイル保存のベストプラクティス

アップロード処理を安全に実装するためのポイントをまとめます。

  • ファイルサイズ制限:c.Request.BodyContent-Lengthを確認し、許容範囲を超える場合は拒否します。
  • 拡張子だけでなくMIMEタイプを検証:http.DetectContentTypeで実際のバイナリを確認します。
  • 保存先ディレクトリはWebサーバーの公開ディレクトリ外に置き、必要に応じて静的ファイルサーバーで配信します。
  • ファイル名の衝突を防ぐため、UUIDやタイムスタンプを付与して一意にします。
  • アップロード後は必ず検証(画像のリサイズやサニタイズ)を行い、悪意あるファイルが実行されないようにします。

これらの検証を組み合わせることで、Gin初心者でも安全かつ堅牢なファイルアップロード機能を構築できます。

この記事はAIによって作成されました。

コメント