ホームページ バックエンド開発 Golang Go Gin のマルチパート フォームで JSON データと画像を受け取る方法は?

Go Gin のマルチパート フォームで JSON データと画像を受け取る方法は?

Dec 03, 2024 am 01:25 AM

How to Receive JSON Data and an Image with Go Gin's Multipart Forms?

Go Gin で JSON データと画像を受信する

Gin は、HTTP リクエストを処理するための便利なメカニズムを提供する Go の人気のある Web フレームワークです。この特定のシナリオでは、マルチパート フォームを通じて JSON データと画像の両方を受信することに関心があります。

データ受信用の構造体

両方の JSON データを受信するにはとイメージを使用して、受信したファイルの構造をミラーリングする構造体を定義できます。 request:

type RequestData struct {
    Avatar *multipart.FileHeader `form:"avatar" binding:"required"`
    UserData struct {
        Username string `json:"username" binding:"required,min=4,max=20"`
        Description string `json:"description" binding:"required,max=100"`
    } `form:"user" binding:"required"`
}
ログイン後にコピー

リクエストのバインド

Gin の c.Bind メソッドを使用して、リクエスト データを定義された構造体にバインドできます。ただし、マルチパート フォームを扱っているため、c.ShouldBindWith を明示的に使用する必要があります。

var request RequestData
if err := c.ShouldBindWith(&request, binding.FormMultipart); err != nil {
    // Handle error if binding fails
}
ログイン後にコピー

画像の処理

バインド後、リクエスト.Avatar フィールドには画像ファイルが保持されます。画像を処理するサンプル コードは次のとおりです。

if data, err := request.Avatar.Open(); err == nil {
    // Process image data
} else {
    // Handle error if opening the file fails
}
ログイン後にコピー

JSON データの処理

JSON データはすでに request.UserData にバインドされています。フィールドに直接アクセスできます:

username := request.UserData.Username
ログイン後にコピー

使用例

Gin ハンドラーでこのアプローチを使用する方法の例を次に示します:

import (
    "github.com/gin-gonic/gin"
)

func handleMultipart(c *gin.Context) {
    var request RequestData
    if err := c.ShouldBindWith(&request, binding.FormMultipart); err != nil {
        // Handle error if binding fails
        return
    }

    // Process the image and handle any validation or business logic
}
ログイン後にコピー

注: ジンのリクエスト バインディングに精通している場合は、なぜそうなるのか疑問に思うかもしれません。 c.Bind の代わりに c.ShouldBindWith を明示的に使用しています。マルチパート フォームの場合、Gin は Content-Type ヘッダーに基づいて適切なバインド方法 (FormMultipart) を自動的に選択します。ただし、意図を明確にし、リクエストが正しくバインドされていることを確認するために、明示的に c.ShouldBindWith を使用します。

以上がGo Gin のマルチパート フォームで JSON データと画像を受け取る方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか? Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

Linterと静的分析ツールを使用して、GOコードの品質と保守性を向上させるにはどうすればよいですか?

See all articles