El marco gin en lenguaje Go [cargar archivos-varios archivos] + configuración de cookies (9)

¿Problemas al cargar varias imágenes en el campo de archivos?

 

pagina 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}}

Archivo de enrutamiento: 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)

	}
}

controladores código del controlador 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
	 	}
	}

}

Lo anterior es la parte del código sobre la carga de varios archivos a través de la etiqueta de entrada de atributos múltiples.

Además, al almacenar archivos en el servidor local, necesitamos distinguir una gran cantidad de imágenes o archivos antes de almacenarlos. El almacenamiento agrupado facilita la consulta posterior de los archivos, aquí podemos agrupar archivos y almacenarlos en formato de fecha * formato de marca de tiempo.

Aquí hay algunos cambios en el código:

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") Es un método utilizado en el marco gin para obtener la carga de un único archivo . Recibe un parámetro como nombre del campo del formulario de carga del archivo y devuelve un  *multipart.FileHeader objeto y un posible error.

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

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

    // 其他逻辑
}

En este ejemplo, el archivo cargadoc.FormFile("file")  se recuperará según el nombre del campo del formulario  . Si el archivo no existe o se produce un error, se devolverá el error correspondiente."file" 

Luego, puede procesar aún más el archivo según las necesidades reales, como guardarlo en una ruta específica.

Cabe señalar que este método solo puede obtener el estado de la carga de un único archivo. Si necesita procesar varias cargas de archivos con el mismo nombre, puede utilizar el método mencionado anteriormente . No entraré en demasiados detalles aquí sobre si cargar varios archivos o un solo archivo (si tienes alguna pregunta, puedes dejar un mensaje). c.Request.MultipartForm.File 

Respecto al uso de ctx.setCookie()...

En el marco de Gin, utilice ctx.SetCookie()métodos para configurar cookies. El siguiente es un ejemplo de implementación específico:

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

En este ejemplo, utilizamos c.SetCookie()el método para configurar la cookie. Los parámetros recibidos por el método son los siguientes:

  • El primer parámetro es el nombre de la cookie.
  • El segundo parámetro es el valor de la cookie.
  • El tercer parámetro es el tiempo de caducidad de las cookies en segundos. En este ejemplo, establezca el tiempo de caducidad de las cookies en 3600 segundos (es decir, 1 hora).
  • El cuarto parámetro es la ruta de la cookie y especifica la ruta donde está disponible la cookie. En este ejemplo, lo configuramos en la ruta raíz "/".
  • El quinto parámetro es el dominio de la cookie, especificando el nombre del dominio donde está disponible la cookie. En este ejemplo, lo configuramos en "localhost", lo que significa que solo se puede utilizar en el entorno de prueba local.
  • El sexto parámetro es un valor booleano que indica si se debe utilizar HTTPS para enviar cookies. En este ejemplo lo configuramos como falso.
  • El séptimo parámetro es un valor booleano que indica si el atributo SameSite está habilitado. En este ejemplo lo configuramos como verdadero.

Con esta configuración, la cookie se puede enviar al cliente en la respuesta, y el cliente la almacenará automáticamente y la enviará de regreso al servidor en solicitudes posteriores.

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。

Es importante tener en cuenta que este es sólo un ejemplo sencillo. En aplicaciones reales, es posible que necesite realizar configuraciones más detalladas según sea necesario, como configurar el tiempo de vencimiento de las cookies, el nombre de dominio, la etiqueta segura, etc. Además, el marco Gin también proporciona c.SetSameSite()métodos para configurar las propiedades de SameSite y c.SetCookieOptions()las propiedades de Cookie con más detalle.

Respecto al tiempo de caducidad de las cookies:

El valor de segundos de tiempo establecido es un número entero mayor que 0: representa el tiempo de vencimiento en segundos y caducará automáticamente y el navegador lo borrará.

El valor de segundos de tiempo establecido es un número entero menor que 0: significa que ha caducado y también se puede utilizar como un programa para eliminar la cookie de eliminación.

 

¡Espero que este artículo sea útil para tu estudio!

Supongo que te gusta

Origin blog.csdn.net/A_LWIEUI_Learn/article/details/131483155
Recomendado
Clasificación