创建文件上传 API 是许多涉及用户提交文档、图像或其他媒体文件的 Web 应用程序的常见要求。在本文中,我们将指导您使用 Go 和 Gin 框架构建安全高效的文件上传 API。您将学习如何设置项目、处理传入文件并安全存储它们,确保您的应用程序能够可靠地管理用户上传的内容。
去1.21
设置 Go 项目依赖项。
go mod init app go get github.com/gin-gonic/gin
├─ main.go ├─ models │ └─ product.go └─ public └─ index.html
Product 是一个简单的结构,用于在我们的文件上传 API 中测试文件上传。
package models type Product struct { Name string }
此文件设置文件上传 API。它将创建并设置最小的 Go Web 应用程序。
package main import ( "app/models" "io" "net/http" "os" "path/filepath" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" ) func main() { router := gin.Default() uploadPath := "./public/uploads" os.MkdirAll(uploadPath, os.ModePerm) router.Static("/uploads", uploadPath) router.StaticFile("/", "./public/index.html") router.POST("/submit", func(c *gin.Context) { var product models.Product if err := c.ShouldBindWith(&product, binding.FormMultipart); err != nil { c.AbortWithStatusJSON(http.StatusBadRequest, err.Error()) return } image, _ := c.FormFile("Image") filePath := filepath.Join(uploadPath, image.Filename) src, _ := image.Open() dst, _ := os.Create(filePath) io.Copy(dst, src) c.JSON(http.StatusOK, gin.H{"Name": product.Name, "Image": image.Filename}) }) router.Run() }
此 HTML 表单专为用户上传产品名称以及关联的图像文件而设计。
<!DOCTYPE html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/css/bootstrap.min.css" rel="stylesheet"> <script> function submitForm() { let form = document.getElementById('form') let data = new FormData(form) fetch('submit', { method: 'POST', body: data }).then(res => { res.json().then(result => { let alert = document.getElementById('alert') alert.children[0].innerText = `Upload success!\nName: ${result.Name}\nImage: ${result.Image}` alert.children[1].src = `/uploads/${result.Image}` alert.classList.remove('d-none') form.reset() }) }) return false } </script> </head> <body> <div class="container"> <div class="row mt-3"> <form id="form" onsubmit="return submitForm()"> <div class="mb-3 col-12"> <label class="form-label" for="name">Name</label> <input id="name" name="Name" class="form-control form-control-sm" required /> </div> <div class="mb-3 col-12"> <label class="form-label" for="image">Image</label> <input type="file" accept="image/*" id="image" name="Image" class="form-control form-control-sm" required /> </div> </div> <div class="col-12"> <button class="btn btn-sm btn-primary">Submit</button> </div> </form> <div id="alert" class="alert alert-success mt-3 d-none"> <p></p> <img id="img" width="200px" /> </div> </div> </div> </body> </html>
表单设置为通过JavaScript函数submitForm()提交,该函数在表单提交时触发。另外,还有一个隐藏的提醒部分,可以显示上传的图片以及提交成功后的成功消息。
go run main.go
打开网络浏览器并转到http://localhost:8080
你会发现这个测试页。
在输入字段中输入名称并浏览要上传的文件。
点击提交按钮发送表单。然后,您将看到一条成功消息以及从我们的 API 返回的已提交信息。
本质上,Go 与 Gin 框架简化了 Web 应用程序中文件上传的管理。通过使用简单的处理程序和表单设置,您可以有效地处理文件上传并改善项目中的用户体验。
源代码:https://github.com/stackpuz/Example-File-Upload-Go
在几分钟内创建一个 CRUD Web 应用程序:https://stackpuz.com
以上是在 Go 中构建文件上传 API的详细内容。更多信息请关注PHP中文网其他相关文章!