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

Posted

技术标签:

【中文标题】上传文件时杜松子酒不断返回204【英文标题】:Gin keeps returning 204 when uploading file 【发布时间】:2020-06-06 16:29:09 【问题描述】:

我正在使用 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")
        

    

有什么想法吗?

【问题讨论】:

您只关注上传路径中的PATCH 方法。看看file uploads section from the gin README 我还是不明白是什么问题。我在前端使用 PATCH,所以它应该与杜松子酒中的这个端点匹配。 这是正常行为 204 是 gin OPTIONS 请求的默认响应。你确定你有正确的CORS 设置吗? 这能回答你的问题吗? Go gin framework CORS 【参考方案1】:

您可以通过使用POST 方法而不是PATCH 来实现此目的。

例如:

func main() 
    router := gin.Default()

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

    router.Use(cors.Default())

    router.Run()

潜在的 CORS 问题

您可能需要在 Go 服务中设置正确的 Cross-Origin Resource Sharing。

一些额外的参考

SO answer on differences between common HTTP methods - What is the difference between PUT, POST and PATCH?.

PATCH:提交对资源的部分修改。如果您只需要更新资源的一个字段,您可能需要使用 PATCH 方法。

How does HTTP file upload work?

【讨论】:

我将所有内容都更改为 POST。不幸的是,结果完全相同。 所以OPTIONS 请求是在客户端自动发出的。您还需要在服务器上处理该问题。查看您从表单发送到服务器的 POST 请求可能会有所帮助。 go 服务是否从与表单/客户端相同的域/主机运行? gin自动处理OPTIONS请求。【参考方案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。我很确定它会解决你的问题。

【讨论】:

以上是关于上传文件时杜松子酒不断返回204的主要内容,如果未能解决你的问题,请参考以下文章

在 JOIN 中没有同时在两列上使用杜松子酒

golang Golang +杜松子酒でファイルをダウンロードさせる

springboot204错误

Flask 文件上传返回错误 405 方法不允许

ASP上传图片提示文件名重复?

IIS上传大文件