Джин продолжает возвращать 204 при загрузке файла - PullRequest
0 голосов
/ 22 февраля 2020

Я получаю 204 с методом OPTIONS, но кажется, что конечная точка не достигнута enter image description here

Просто создаю простую конечную точку загрузки файла, например:

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

    }
}

Есть идеи почему?

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Используйте ниже 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. Я совершенно уверен, что это решит вашу проблему.

0 голосов
/ 22 февраля 2020

Вы можете достичь этого, используя метод POST вместо PATCH.

Например:

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

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

    router.Use(cors.Default())

    router.Run()
}

Потенциальная проблема CORS

Возможно, вам потребуется правильно настроить Обмен ресурсами между источниками в вашей Go службе ,

Некоторые дополнительные ссылки

SO отвечает на различия между общими методами HTTP - В чем разница между PUT, POST и PATCH? .

PATCH: отправляет частичное изменение ресурса. Если вам нужно обновить только одно поле для ресурса, вы можете использовать метод PATCH.

Как работает загрузка файла HTTP?

...