Фреймворк gin на языке Go [загрузка файлов-несколько файлов] + настройки 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 для загрузки одного файла . Он получает один параметр в качестве имени поля формы загрузки файла и возвращает  *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.
  • Второй параметр — это значение файла cookie.
  • Третий параметр — срок действия cookie в секундах. В этом примере установите срок действия cookie на 3600 секунд (т. е. 1 час).
  • Четвертый параметр — это путь к файлу cookie, указывающий путь, по которому файл cookie доступен. В этом примере мы установили корневой путь «/».
  • Пятый параметр — это домен файла cookie, определяющий имя домена, на котором доступен файл cookie. В этом примере мы установили для него значение «localhost», что означает, что его можно использовать только в локальной тестовой среде.
  • Шестой параметр — это логическое значение, указывающее, использовать ли HTTPS для отправки файлов cookie. В этом примере мы установили значение false.
  • Седьмой параметр — это логическое значение, указывающее, включен ли атрибут 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