猿问

上传文件时杜松子酒不断返回204

我用 OPTIONS 方法得到一个 204,但似乎没有达到终点 

只需像这样构建一个简单的文件上传端点:


package main


import  (

    "cloud.google.com/go/storage"

    "github.com/gin-gonic/gin"

    "github.com/gin-contrib/cors"

    "google.golang.org/api/option"

    "io"

    "log"

)


 const uploadBucket = "some-cool-bucket-name"

 const uploadApiKey = "some-advanced-key"


func main() {

    router := gin.Default()


    rg := router.Group("api/v1/photo")

    {

        rg.PATCH("/", uploadFile)

    }


    router.Use(cors.Default())


    router.Run()

}


func uploadFile(c *gin.Context) {

    mr, e := c.Request.MultipartReader()

    if e != nil {

        panic("Error reading request")

    }


    client, e := storage.NewClient(c, option.WithAPIKey(uploadApiKey))

    bucket := client.Bucket(uploadBucket)


    for {

        p, e := mr.NextPart()


        if e == io.EOF {

            break

        } else if e != nil {

            panic("Error processing file")

        }


        w := bucket.Object(p.FileName()).NewWriter(c)


        if _, e := io.Copy(w, p); e != nil {

            panic("Error during chunk upload")

        } else if e := w.Close(); e != nil {

            panic("Could not finalize chunk writing")

        }


    }

}

任何想法为什么?


尚方宝剑之说
浏览 220回答 2
2回答

呼啦一阵风

在 CORS 下使用:func CORS() gin.HandlerFunc {    // TO allow CORS    return func(c *gin.Context) {        c.Writer.Header().Set("Access-Control-Allow-Origin", "*")        c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With")        c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT, DELETE")        if c.Request.Method == "OPTIONS" {            c.AbortWithStatus(204)            return        }        c.Next()    }}接下来,您必须将 cors 添加到您的路线中:    router := gin.Default()    router.Use(CORS())另外,最好使用 POST 方法而不是 PATCH。我很确定它会解决你的问题。

函数式编程

您可以通过使用POST方法而不是PATCH.例如:func main() {     router := gin.Default()     rg := router.Group("api/v1/photo")     {         rg.POST("/", uploadFile)     }     router.Use(cors.Default())     router.Run()}潜在的 CORS 问题您可能需要在 Go 服务中设置正确的跨域资源共享。一些额外的参考所以回答常见 HTTP 方法之间的差异 - PUT、POST 和 PATCH 有什么区别?.PATCH:提交对资源的部分修改。如果您只需要更新资源的一个字段,您可能需要使用 PATCH 方法。HTTP 文件上传是如何工作的?
随时随地看视频慕课网APP

相关分类

Go
我要回答