gin-gonic/gin

How to upload array of files with params

selvam347 opened this issue · 5 comments

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

@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. #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