Модель gin framework + загрузка файлов на языке Go (8)

В среде Gin мы обычно используем шаблон MVC для организации наших приложений. MVC означает «Модель-Представление-Контроллер», который делит наше приложение на три разных уровня, каждый из которых имеет свои конкретные обязанности.

Среди них Контроллер отвечает за обработку запросов пользователей, представление представлений и вызов Модели для обработки бизнес-логики и данных. Представление отвечает за отображение данных и пользовательский интерфейс.

В этом случае мы можем отделить контроллер от кода модели. Это можно сделать, создав отдельный каталог, например «controllers», и написав и обработав там весь код контроллера.

При вызове модели в контроллере мы можем выполнять всю бизнес-логику и обработку данных, импортируя модель и вызывая ее методы. В то же время мы также можем использовать функцию рендеринга шаблонов платформы Gin для рендеринга данных, возвращаемых моделью, в представление HTML. Это позволяет достичь цели полного отделения данных модели и бизнес-логики от представления HTML.

 Используйте у главного входа main.go:

Рендеринг на html-страницу, просмотр слоя

Выше приведен один файл. Как войти в группу маршрутизации из маршрутизаторов запроса —> контроллеров —> шаблона (представление). Эта последовательность потоков смешана с функциями инструмента. В частности,

Вы можете просмотреть загруженный файл буклета:

Как мы можем загрузить несколько файлов?

Чтобы реализовать загрузку файлов в среде Gin, вам необходимо использовать тип данных Multipart/Form. Запросы для этого типа данных делятся на две части: текстовые поля и данные файла. Кроме того, в фреймворке 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[имя файла], где имя файла относится к имени поля формы загруженного файла. Этот метод возвращает указатель типа 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"] . Затем просмотрите эти файлы, создайте каталог с тем же именем и сохраните файлы. Наконец, ответное сообщение записывается в тело ответа.

Разница между двумя типами одновременной загрузки нескольких файлов:

c.Request.MultipartForm и  c.MultipartForm() представляют собой два метода в среде Gin для обработки данных, состоящих из нескольких частей. Они функционально схожи, но используют несколько разные способы.

  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.Default() Независимо от того, какой метод вы выберете, вам нужно будет добавить промежуточное программное обеспечение, например или  , в функцию, которая обрабатывает маршрутизацию  gin.RouterGroup.Use(), чтобы гарантировать, что платформа Gin правильно анализирует и обрабатывает данные многочастной формы.

Дополните пример относительно интуитивно понятной загрузки нескольких файлов, подходящей для небольшого количества нескольких файлов;

Просмотр страницы 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