使用 errgroup.Group 处理 gin框架的上传多文件功能问题

前端用户上传两个文件,一个名为cert,另一个为 key,后端使用 errgroup.Group 来处理。

package main

import (
    "fmt"
    "log"
    "golang.org/x/sync/errgroup"
    "github.com/gin-gonic/gin" 
)

func GetSaveFile(file string) string {
    return "file_" + file
}

func main() {
    r := gin.Default()
    v1 := r.Group("/api")
    {
        v1.POST("/v1/upload", UploadCert)
    }

    r.Run()
}

func UploadCert(c *gin.Context) {

    var saveCertFile, saveKeyFile string

    var eg errgroup.Group
    eg.Go(func()error{
        certFile, err := c.FormFile("cert")
        if err != nil {
            fmt.Errorf("cert upload: %s", err)
            return err
        }
    
        // upload file
        saveCertFile = GetSaveFile(certFile.Filename)
        if err := c.SaveUploadedFile(certFile, saveCertFile); err != nil {
            fmt.Errorf("cert move: %s", err)
            return err
        }

        return nil
    })

    eg.Go(func()error{
        certFile, err := c.FormFile("file")
        if err != nil {
            fmt.Errorf("key upload: %s", err)
            return err
        }
    
        // upload file
        saveKeyFile = GetSaveFile(certFile.Filename)
        if err := c.SaveUploadedFile(certFile, saveKeyFile); err != nil {
            fmt.Errorf("key move: %s", err)
            return err
        }

        return nil
    })

    if err := eg.Wait(); err!= nil {
        log.Fatal(err)
    }

    fmt.Println(saveCertFile, saveKeyFile)
}

异常错误

- unexpected EOF

而且每次的错误还不一样,如果弃用 errgroup.Group 用法,改为传统的顺序处理上传文件的话则完全正常。

阅读 1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题