Read multipart-form data as []byte in GO

Aji Tirta picture Aji Tirta · Mar 13, 2017 · Viewed 14.3k times · Source

I'm using GIN as GO framework, im having an issue when uploading file and directly convert image as byte so i can store it in my BLOB field inside db table, so i have my piece of code like this :

func (a *AppHandler) Upload(ctx *gin.Context) {

form := &struct {
    Name    string `form:"name" validate:"required"`
    Token   string `form:"token" validate:"required"`
    AppCode string `form:"app_code" validate:"required"`
}{}
ctx.Bind(form)
if validationErrors := a.ValidationService.ValidateForm(form); validationErrors != nil {
    httpValidationErrorResponse(ctx, validationErrors)
    return
}

file, header, err := ctx.Request.FormFile("file")

and im trying to store it in db like this

app.SetFile(file)
a.AppStore.Save(app)

and it returns this kind of error:

cannot use file (type multipart.File) as type []byte 

so how to fix this? im pretty new with Go language
NOTE: i'm using GORM as well for my db ORM

Answer

Steve C picture Steve C · Mar 13, 2017

multipart.File implements io.Reader interface so you could copy its content into a bytes.Buffer like this:

file, header, err := ctx.Request.FormFile("file")    
defer file.Close()
if err != nil {
    return nil, err
}

buf := bytes.NewBuffer(nil)
if _, err := io.Copy(buf, file); err != nil {
    return nil, err
}

and then add to your app

app.SetFile(buf.Bytes())