gin フレームワーク モデル + Go 言語でファイルをアップロード (8)

Jin フレームワークでは、通常、MVC パターンを使用してアプリケーションを編成します。MVC は Model-View-Controller の略で、アプリケーションを 3 つの異なる層に分割し、それぞれに特定の役割があります。

その中で、コントローラーはユーザーのリクエストを処理し、ビューを表示し、モデルを呼び出してビジネス ロジックとデータを処理する責任を負います。View はデータとユーザー インターフェイスの表示を担当します。

この場合、コントローラーをモデルコードから分離できます。これを行うには、「controllers」などの別のディレクトリを作成し、そこにすべてのコントローラー コードを記述して処理します。

コントローラーでモデルを呼び出すときは、モデルをインポートしてそのメソッドを呼び出すことで、すべてのビジネス ロジックとデータ処理を処理できます。同時に、Gin フレームワークのテンプレート レンダリング関数を使用して、モデルから返されたデータを HTML ビューにレンダリングすることもできます。これにより、モデルのデータとビジネス ロジックを HTML ビューから完全に分離するという目標が達成されます。

 main.go のメインエントランスで使用します:

HTML ページにレンダリング、レイヤーを表示

上記は一つのファイルです リクエストルータ→コントローラ→テンプレート(ビュー)からルーティンググループに入る方法 この一連の流れにツールの機能が混在しています 具体的には

アップロードされたリーフレット ファイルを表示できます。

複数のファイルをアップロードするにはどうすればよいですか?

Gin フレームワークでファイルのアップロードを実装するには、Multipart/Form データ型を使用する必要があります。このデータ タイプのリクエストは、テキスト フィールドとファイル データの 2 つの部分に分割されます。さらに、Gin フレームワークには multipart.Form パーサー c.MultipartForm() が組み込まれており、アップロードされたファイルの処理が容易になります。具体的な手順は次のとおりです。

1. HTML で、フォームの enctype 属性を multipart/form-data に設定します。これにより、これがファイルのアップロード要求であることがサーバーに認識されます。

注:c.Request.MultipartForm 元のリクエスト オブジェクト内のマルチパート フォーム データにアクセスするために使用されるフィールドです。このフィールドは、 *multipart.Form マルチパート フォーム データを解析および処理するために使用できるメソッドを含むオブジェクトを提供します。

2. サーバー側で、リクエスト内のファイル データを取得します。c.Request.MultipartForm() を使用して multipart.Form データ型を取得します。このメソッドは、リクエスト内のテキスト フィールドとファイル データを自動的に解析します。ファイル データはサーバーのメモリまたはディスクに保存されます。c.SaveUploadedFile()メソッドを使用して、指定したパスにファイルを保存できます。

3. ファイル名など、アップロードされたファイルのメタデータを取得したい場合は、c.Request.MultipartForm.File[filename] を使用できます。ここで、filename はアップロードされたファイルのフォーム フィールド名を指します。このメソッドは multipart.FileHeader 型のポインターを返し、そこからファイルのメタデータを取得できます。たとえば、ファイル名を取得したい場合は、c.Request.MultipartForm.File[filename][0].Filename を使用できます。

4. 複数のファイルをアップロードするには、ループを使用してアップロードされた各ファイルのデータを処理する必要があります。サンプルコードは次のとおりです。

func main() {
    router := gin.Default()

    router.POST("/upload", func(c *gin.Context) {
        //设置最大内存
        c.Request.ParseMultipartForm(32 << 20)

        //获取multipart/form-data数据类型
        form := c.Request.MultipartForm

        //获取上传的文件
        files := form.File["upload[]"] 

        //循环处理每个上传文件
        for _, file := range files {
            //保存文件到指定的路径
            err := c.SaveUploadedFile(file, "uploads/"+file.Filename)
            if err != nil {
                log.Println(err)
            }
        }

        c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
    })

    router.Run(":8080")
}

このコードは、「upload[]」という名前のフォーム フィールドを処理します。アップロードされたファイルごとに、ファイルをアップロード ディレクトリに保存し、アップロードされたファイルの数を返します。

さらに、メソッド [c.MultipartForm()] があります。c.MultipartForm() これは、元のリクエスト オブジェクト内のマルチパート フォーム データを解析して、Gin コンテキスト オブジェクトにバインドするために使用されるメソッドです。このメソッドは (*multipart.Form, error) オブジェクトを返します。

例:

func uploadMultiFiles(c *gin.Context) {
	// 获取上传的多个文件
	form, _ := c.MultipartForm()
	files := form.File["file"]

	// 遍历保存多个文件
	for _, file := range files {
		filename := file.Filename
		dst := "./upload/" + filename
		// 创建目录
		err := os.MkdirAll(path.Dir(dst), os.ModePerm)
		if err != nil {
			c.String(http.StatusBadRequest, "CreateDir failed: "+err.Error())
			return
		}
		// 保存文件
		if err := c.SaveUploadedFile(file, dst); err != nil {
			c.String(http.StatusBadRequest, "Upload failed: "+err.Error())
			return
		}
	}
	c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files)))
}

上記の例では、c.MultipartForm()メソッドを使用してアップロードされたフォームを取得し、 form.File["file"]を使用して複数のアップロードされたファイルを取得できます次に、これらのファイルを繰り返し処理し、同じ名前のディレクトリを作成してファイルを保存します。最後に、応答メッセージが応答本文に書き込まれます。

2 つのタイプの複数ファイルの同時アップロードの違いは次のとおりです。

c.Request.MultipartForm および は、 c.MultipartForm() マルチパート フォーム データを処理するための、Gin フレームワークの 2 つのメソッドです。これらは機能的には似ていますが、使用方法が少し異なります。

  1. c.Request.MultipartForm:

    • http.Request これは、基礎となるオブジェクト内のマルチパート フォーム データにアクセスするために使用される構造体フィールドです 。
    • 関数呼び出しは必要なく、 c.Request.MultipartForm 解析されたフォーム データに直接アクセスできます。
    • このメソッドを使用する場合は、まず解決のためのルーティングを処理する関数内でメソッドを呼び出す必要があります c.Request.ParseMultipartForm 。
  2. c.MultipartForm():

    • これは、リクエストから解析されたマルチパート フォーム データを返す関数です。
    • c.MultipartForm() フォームデータを取得するには関数呼び出しが必要です 。
    • このメソッドを使用すると、Gin フレームワークは、明示的な呼び出しを必要とせずに、マルチパート フォーム データを自動的に解析します c.Request.ParseMultipartForm

どの方法を使用するかは、個人の好みと特定のニーズによって異なります。

  • 基礎となるオブジェクトを直接操作し、そのオブジェクト内のマルチパート フォーム データにアクセスしたい場合は、 http.Request これを使用します c.Request.MultipartForm
  • 単純な関数呼び出しで解析されたマルチパート フォーム データを取得したい場合は、 を使用できます c.MultipartForm()

どちらの方法を選択する場合でも、 Gin フレームワークがマルチパート フォーム データを正しく解析して処理できるように、ルーティングを処理する関数に gin.Default() や など のミドルウェアを追加する必要があります。gin.RouterGroup.Use()

少数の複数ファイルに適した、比較的直感的な複数ファイルのアップロードの例を補足します。

Index.html ページビュー (ビューレイヤー)

    <form action="/upfile/add" method="post" enctype="multipart/form-data">
        用户名:<input type="text" name="username" id="username">
        <br>
        头像1: <input type="file" name="file1" id="file1">
        <br>
        头像2: <input type="file" name="file2" id="file2">

        <br>
        <input type="submit" value="提交">
    </form>

コントローラー

func (con UpfileControllers) Add(c *gin.Context) {
	username := c.PostForm("username")
	// 1.form表单上传file 文件如何接收?
	file1, err1 := c.FormFile("file1")
	file2, err2 := c.FormFile("file2")
	//err == nil 表示“没有发生错误” 就上传文件到本地  ./static/upload/ 拼接上文件名字
	if err1 == nil {
		dst1 := path.Join("./static/upload", file1.Filename)

		c.SaveUploadedFile(file1, dst1)
		fmt.Println("file文件------")
	}
	if err2 == nil {
		dst2 := path.Join("./static/upload", file2.Filename)

		c.SaveUploadedFile(file2, dst2)
		fmt.Println("file文件------")
	}

	c.String(200, "上传文件--string-success-用户%v-图片%v \n", username, file1.Filename, file2.Filename)

}


// 终端输出

上传文件--string-success-用户eee-图片红点奖.png| 图片logo.png  



ルーター (ルート) upfileRouter.go

package routers

import (
	"***/controllers/upfile"
	"***/middlewares"

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

func UpfileRouterInit(r *gin.Engine) {
	upfileRouter := r.Group("/upfile", middlewares.InitMiddleWares) //添加一个中间件测试一下
	{
		upfileRouter.GET("/", upfile.UpfileControllers{}.Index)
		upfileRouter.POST("/add", upfile.UpfileControllers{}.Add)
	}
}

上記は、複数のファイルを使用する別の実施形態である。

あなたの勉強に役立つことを願っています! お互い励まし合いましょう…

おすすめ

転載: blog.csdn.net/A_LWIEUI_Learn/article/details/131422637