В среде 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 для обработки данных, состоящих из нескольких частей. Они функционально схожи, но используют несколько разные способы.
-
c.Request.MultipartForm
:- Это поле структуры, используемое для доступа к
http.Request
данным многочастной формы в базовом объекте. - Он не требует вызовов функций, и
c.Request.MultipartForm
вы можете напрямую получить доступ к анализируемым данным формы. - При использовании этого метода вам необходимо сначала вызвать метод в функции, которая обрабатывает маршрутизацию
c.Request.ParseMultipartForm
для разрешения.
- Это поле структуры, используемое для доступа к
-
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)
}
}
Вышеуказанное представляет собой еще один вариант использования нескольких файлов.
Надеюсь, это будет полезно для вашего обучения! Давайте подбадриваем друг друга…