首页  >  文章  >  后端开发  >  在 Go 中构建文件上传 API

在 Go 中构建文件上传 API

WBOY
WBOY原创
2024-09-05 12:30:39393浏览

Building a File Upload API in Go

创建文件上传 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

项目文件

产品.go

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()
}

  • 初始化 Gin 路由器并设置为上传目录和 index.html 提供静态文件服务。
  • 确保 ./public/uploads 目录存在用于存储上传的文件。
  • 在 /submit 定义一个 POST 路由来处理文件上传,将文件保存到服务器,并返回产品名称和上传的文件名。
  • 启动 Gin 服务器来监听传入的请求。

索引.html

此 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

你会发现这个测试页。

Building a File Upload API in Go

测试

在输入字段中输入名称并浏览要上传的文件。

Building a File Upload API in Go

点击提交按钮发送表单。然后,您将看到一条成功消息以及从我们的 API 返回的已提交信息。

Building a File Upload API in Go

本质上,Go 与 Gin 框架简化了 Web 应用程序中文件上传的管理。通过使用简单的处理程序和表单设置,您可以有效地处理文件上传并改善项目中的用户体验。

源代码:https://github.com/stackpuz/Example-File-Upload-Go

在几分钟内创建一个 CRUD Web 应用程序:https://stackpuz.com

以上是在 Go 中构建文件上传 API的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn