Go 言語の gin フレームワーク [ファイルのアップロード - 複数のファイル] + Cookie 設定 (9)

ファイルフィールドに複数の画像をアップロードする際に問題がありますか?

 

htmlページ

{
   
   {define "admin/register/index.html"}}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>admin/register/index.html</title>
</head>
<body>
    <form action="/admin/register/edit" method="post" enctype="multipart/form-data">

        用户名:<input type="text" name="username" id="username">

        <br>
        
        头像: <input type="file" name="files" id="files" multiple> 
 
        <input type="submit" value="提交">
    </form>
</body>
</html>


{
   
   {end}}

ルーティング ファイル: adminRouters.go

package routers

import (
	"project/controllers/admins"

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

func AdminRoutersInit(r *gin.Engine) {
	adminRouter := r.Group("/admin")
	{
		//
		adminRouter.GET("/", admins.AdminControllers{}.Index)

		// 登录
		adminRouter.GET("/index", admins.AdminControllers{}.PageIndex)
		adminRouter.POST("/login", admins.AdminControllers{}.Login)

		// 注册页面  上传多文件 multiple
		adminRouter.GET("/register", admins.AdminControllers{}.Register)
		adminRouter.POST("/register/edit", admins.AdminControllers{}.Edit)

		// 展示页面
		adminRouter.GET("/views", admins.AdminControllers{}.Views)

	}
}

コントローラー コントローラー コード adminControllers.go:

package admins

import (
	"fmt"
	"net/http"
	"os"
	"path"
	"project/models"
	"strconv"

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

type AdminControllers struct{}

func (con AdminControllers) Index(c *gin.Context) {
	c.String(200, "admin后管项目")
}

func (con AdminControllers) PageIndex(c *gin.Context) {
	c.HTML(200, "admin/login/index.html", gin.H{
		"title": "admin后管项目",
	})
}

func (con AdminControllers) Login(c *gin.Context) {

	username := c.PostForm("username")
	password := c.PostForm("password")

	c.String(200, "用户名:=%v,密码:=%v \n", username, password)

	// c.HTML(200, "admin/views/index.html", gin.H{
	// 	"title": "viewAdmin页面",
	// })

}

func (con AdminControllers) Register(c *gin.Context) {
	c.HTML(200, "admin/register/index.html", gin.H{
		"title": "注册页面",
	})
}

func (con AdminControllers) Edit(c *gin.Context) {

	username := c.PostForm("username")

	fmt.Printf("username==%v \n", username)

	//1. html 页面有   multiple属性时候   头像: <input type="file" name="files" id="files" multiple>   通过 multipartform 获取上传文件form,         
     err := c.MultipartForm()
     if err != nil {
	 	c.String(http.StatusBadRequest, "get form err: %s", err.Error())
	 	return
	 }
	 files := form.File["files"]
	 // 当前时间获取
	 for _, file := range files {
	 	// fmt.Println("==========path=%v \n", file.Filename)
	 	filename := filepath.Base(file.Filename)
	 	// fmt.Println("===========%v \n", filename)
 	    dst := path.Join("./static/upload", filename)
	 	if err := c.SaveUploadedFile(file, dst); err != nil {
	 		c.String(http.StatusBadRequest, "upload file err: %s", err.Error())
	 		return
	 	}
	}

}

上記は複数属性入力タグによる複数ファイルアップロードに関するコード部分です。

さらに、ローカル サーバーにファイルを保存する場合、保存する前に多数の写真やファイルを区別する必要があります。ストレージをグループ化すると、その後のファイルのクエリが容易になります。ここでは、ファイルをグループ化し、日付形式 * タイムスタンプ形式で保存できます。

コードへのいくつかの変更を次に示します。

package admins

import (
	"fmt"
	"net/http"
	"os"
	"path"
	"project/models"
	"strconv"

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

type AdminControllers struct{}

func (con AdminControllers) Index(c *gin.Context) {
	c.String(200, "admin后管项目")
}

func (con AdminControllers) PageIndex(c *gin.Context) {
	c.HTML(200, "admin/login/index.html", gin.H{
		"title": "admin后管项目",
	})
}

func (con AdminControllers) Login(c *gin.Context) {

	username := c.PostForm("username")
	password := c.PostForm("password")

	c.String(200, "用户名:=%v,密码:=%v \n", username, password)

	// c.HTML(200, "admin/views/index.html", gin.H{
	// 	"title": "viewAdmin页面",
	// })

}

func (con AdminControllers) Register(c *gin.Context) {
	c.HTML(200, "admin/register/index.html", gin.H{
		"title": "注册页面",
	})
}

func (con AdminControllers) Edit(c *gin.Context) {

	username := c.PostForm("username")

	fmt.Printf("username==%v \n", username)

	//1. 获取上传文件
	file, err := c.FormFile("file")

	if err == nil {
		// 2. 获取文件后缀,判断是否类型正确 .png,.jpg,.gif,.jpeg,.png

		extName := path.Ext(file.Filename)

		allowExtMap := map[string]bool{
			".jpg":  true,
			".gif":  true,
			".png":  true,
			".jpeg": true,
		}

		if _, ok := allowExtMap[extName]; !ok {
			// c.Redirect() // 也可以跳转
			c.String(200, "上传的文件类型不合法")
			return
		}

		// 创建图片保存目录 、static/upload/20230630
		dayNum := models.GetDay()

		dir := path.Join("./static/upload", dayNum)

		err := os.MkdirAll(dir, 0666)
		if err != nil {
			fmt.Println(err)
			c.String(200, "MkdirAll失败")
			return
		}
		// 生成文件名称 和 文件保存的 目录
		// unix := models.GetUnix()
		// // unix + extName = filename
		// filename := strconv.FormatInt(unix, 10) + extName
		// 合并成一句
		filename := strconv.FormatInt(models.GetUnix(), 10) + extName

		// 执行上传
		dst := path.Join(dir, filename)
		c.SaveUploadedFile(file, dst)
	}


}

func (con AdminControllers) Views(c *gin.Context) {

	c.SetCookie("username", "王二妹", 3600, "/", "localhost", false, true)

	// c.String(200, "Views页面")
	c.HTML(http.StatusOK, "admin/views/index.html", gin.H{
		"title": "views页面",
	})
}

c.FormFile("file") これは、単一ファイルのアップロードを取得するために gin フレームワークで使用されるメソッドですファイル アップロード フォームのフィールド名として 1 つのパラメーターを受け取り、 *multipart.FileHeader オブジェクトと考えられるエラーを返します。

func uploadFile(c *gin.Context) {
    // 获取上传的文件
    file, err := c.FormFile("file")
    if err != nil {
        // 错误处理逻辑
    }

    // 处理文件
    // 保存文件到指定的路径
    err = c.SaveUploadedFile(file, "上传目录/"+file.Filename)
    if err != nil {
        // 错误处理逻辑
    }

    // 其他逻辑
}

この例では、アップロードされたファイルはc.FormFile("file") フォームフィールド名に基づいて取得されます ファイルが存在しない場合、またはエラーが発生した場合は、適切なエラーが返されます。"file" 

その後、指定したパスにファイルを保存するなど、実際のニーズに応じてファイルをさらに処理できます。

このメソッドは単一ファイルのアップロードのステータスしか取得できないことに注意してください。同じ名前の複数のファイルのアップロードを処理する必要がある場合は、前述の方法を使用できます複数のファイルをアップロードするか、単一のファイルをアップロードするかについては、ここでは詳しく説明しません (質問がある場合は、メッセージを残してください)。 c.Request.MultipartForm.File 

ctx.setCookie()の使用について...

Gin フレームワークでは、ctx.SetCookie()メソッドを使用して Cookie を設定します。具体的な実装例を次に示します。

func setCookie(c *gin.Context) {
    // 设置Cookie的参数和值
    c.SetCookie("my_cookie", "example value", 3600, "/", "localhost", false, true)
    
    // 其他逻辑
}

この例では、c.SetCookie()メソッドを使用して Cookie を設定します。このメソッドによって受け取られるパラメータは次のとおりです。

  • 最初のパラメータは Cookie の名前です。
  • 2 番目のパラメータは Cookie の値です。
  • 3 番目のパラメータは、Cookie の有効期限 (秒単位) です。この例では、Cookie の有効期限を 3600 秒 (つまり 1 時間) に設定します。
  • 4 番目のパラメーターは Cookie のパスで、Cookie が利用可能なパスを指定します。この例では、ルート パス「/」に設定します。
  • 5 番目のパラメータは Cookie のドメインで、Cookie が利用可能なドメイン名を指定します。この例では、「localhost」に設定しています。これは、ローカルのテスト環境でのみ使用できることを意味します。
  • 6 番目のパラメータは、Cookie の送信に HTTPS を使用するかどうかを示すブール値です。この例では、これを false に設定します。
  • 7 番目のパラメーターは、SameSite 属性が有効かどうかを示すブール値です。この例では、これを true に設定します。

この設定を使用すると、応答で Cookie をクライアントに送信でき、クライアントはそれを自動的に保存し、後続のリクエストでサーバーに送り返します。

func (con AdminControllers) Views(c *gin.Context) {

	c.SetCookie("username", "王二妹", 3600, "/", "localhost", false, true)

	// c.String(200, "Views页面")
	c.HTML(http.StatusOK, "admin/views/index.html", gin.H{
		"title": "views页面",
	})
}

方法接收的参数如下:

第一个参数是Cookie的名称。
第二个参数是Cookie的值。
第三个参数是Cookie的过期时间(以秒为单位)。在这个例子中,设置Cookie的过期时间为3600秒(即1小时)。
第四个参数是Cookie的路径,指定Cookie可用的路径。在这个例子中,我们将其设置为根路径 “/”。
第五个参数是Cookie的域,指定Cookie可用的域名。在这个例子中,我们将其设置为 “localhost”,表示只能在本地测试环境使用。
第六个参数是一个布尔值,指示是否使用HTTPS发送Cookie。在这个例子中,我们将其设置为false。
第七个参数是一个布尔值,指示是否启用SameSite属性。在这个例子中,我们将其设置为true。

これは単なる単純な例であることに注意することが重要です。実際のアプリケーションでは、Cookieの有効期限やドメイン名、セキュアタグなどの設定など、必要に応じてさらに詳細な設定が必要になる場合があります。さらに、Gin フレームワークには、c.SetSameSite()SameSite プロパティを設定したり、c.SetCookieOptions()Cookie プロパティをより詳細に設定したりするためのメソッドも提供されています。

Cookieの有効期限について:

設定された時間の秒値は 0 より大きい整数です。これは有効期限を秒単位で表し、自動的に期限切れになり、ブラウザによってクリアされます。

設定された時間秒の値は 0 未満の整数です。これは有効期限が切れたことを意味し、削除 Cookie を削除するプログラムとしても使用できます。

 

この記事があなたの勉強に役立つことを願っています!

おすすめ

転載: blog.csdn.net/A_LWIEUI_Learn/article/details/131483155
おすすめ