Gin: How to upload array of files with params

Created on 23 Dec 2016  路  5Comments  路  Source: gin-gonic/gin

I can upload single file using https://github.com/gin-gonic/gin/issues/548.

package main
import "github.com/gin-gonic/gin"
import "log"
import "net/http"
import "io"
import "os"

func main() {
    router := gin.Default()
    router.POST("/upload", func(c *gin.Context) {
        file, handler, err := c.Request.FormFile("upload")
        filename := handler.Filename
        log.Println("Received file:", handler.Filename)
        out, err := os.Create("./tmp/" + filename)
        if err != nil {
            log.Fatal(err)
        }
        defer out.Close()
        _, err = io.Copy(out, file)
        if err != nil {
            log.Fatal(err)
        }
        c.String(http.StatusOK, "Uploaded...")
    })
    router.Run(":8080")
}

But how to upload array of files like the following,
curl -X POST http://localhost:8080/upload -F "images[]=@/home/amp/hack/property1.jpg" -F "images[]=@/home/ack/property2.jpeg" -H "Content-Type: multipart/form-data"

And give me suggestion for the same above code, how to get some parameters with documents. Finally request will be like,

{
  "client": {
    "name": "",
    "Industry": "",
    "profile_image": "PROFILE-IMAGE-FILE",
    "supporting_docs": {
      "docs": [
        "DOCUMENT1-FILE",
        "DOCUMENT2-FILE"
      ],
      "comments": "Comment test"
    }
  }
} 
enhancement help wanted

All 5 comments

@andreynering does this also work with your form array value patch?

Haven't tried by I don't think so.

c.Request.FormFile is Go's method, not Gin's.

@tboerger @selvam347 @andreynering

I create new PR to support upload single or multiple files. https://github.com/gin-gonic/gin/pull/775

upload single file:

package main

import (
    "github.com/gin-gonic/gin"
    "log"
    "net/http"
)

func main() {
    router := gin.Default()
    router.POST("/upload", func(c *gin.Context) {
        // single file
        file, _ := c.FormFile("file")
        log.Println(file.Filename)

        c.String(http.StatusOK, "Uploaded...")
    })
    router.Run(":8080")
}

curl command:

curl -X POST http://localhost:8080/upload -F "file=@/Users/mtk10671/z.sh" -H "Content-Type: multipart/form-data"

upload multiple file:

package main

import (
    "github.com/gin-gonic/gin"
    "log"
    "net/http"
)

func main() {
    router := gin.Default()
    router.POST("/upload", func(c *gin.Context) {
        // Multipart form
        form, _ := c.MultipartForm()
        files := form.File["upload[]"]

        for _, file := range files {
            log.Println(file.Filename)
        }
        c.String(http.StatusOK, "Uploaded...")
    })
    router.Run(":8080")
}

curl command:

curl -X POST http://localhost:8080/upload -F "upload[]=@/Users/mtk10671/z.sh" -F "upload[]=@/Users/mtk10671/z.sh" -H "Content-Type: multipart/form-data"

Closed by #775

How to upload In S3 Bucket ?
verification

Was this page helpful?
0 / 5 - 0 ratings

Related issues

sofish picture sofish  路  3Comments

Bloomca picture Bloomca  路  3Comments

wangcn picture wangcn  路  3Comments

ccaza picture ccaza  路  3Comments

lilee picture lilee  路  3Comments