golang实现文件上传并转存数据库功能

本文实例为大家分享了golang实现文件上传并转存数据库的具体代码,供大家参考,具体内容如下

需求

上传图片,且可选择将图片保存到数据中。

一、流程图

二、步骤

1.上传文件接口

获取文件,并返回base64string流

代码如下(示例):

func setIconPost(c *gin.Context)  {     //获取文件,icon实现对上传文件的访问,header是对上传文件信息的标记     icon,header,err :=c.Request.FormFile("file")     dangerous(err)     defer icon.Close()     //path.Ext是取后缀,Tolower小写     ext := strings.ToLower(path.Ext(header.Filename))     if header.Size>1024*1024*2{         fmt.Println("文件过大")     }     buf := bytes.NewBuffer(nil)     //读取icon的数据存入buf中     if _,err := io.Copy(buf,icon);err != nil{         return     }     //将base64返回前端     renderData(c, gin.H{         "base64":base64.StdEncoding.EncodeToString(buf.Bytes()),         "icon-ext":ext,     },nil) }

2.存储数据

代码如下(示例):

func setEntPost(c *gin.Context)  {     var f Identical     bind(c,&f)     models.EtpSave(f.Copyright,"copyright")     models.EtpSave(f.Introduction,"introduction")     models.EtpSave(f.Icon,"icon")     models.EtpSave(f.Logo,"logo")     models.EtpSave(f.Version,"version")     models.EtpSave(f.Belong,"belong")     renderMessage(c,nil) }

3.存储的数据库操作

type Etp struct {     Id    int         `json:"id"`     Ckey  string     `json:"ckey"`     Cval  string    `json:"cval"`     Kind  int         `json:"kind"` } func EtpSave(cval, ckey string) error {     var obj Etp     //数据库是否存在     has,err := DB["rdb"].Table("configs").Where("ckey=?",ckey).Get(&obj)     if err != nil{         return err     }     //不存在     if !has {         _, err = DB["rdb"].Table("configs").Where("ckey=?",ckey).Insert(Etp{             Ckey: ckey,             Cval: cval,             Kind: 1,         })     }else{         obj.Cval = cval         DB["rdb"].Table("configs").Where("ckey=?",ckey).Cols("cval").Update(&obj)     }     return err }

4.优化

若上传图片稍大,在转存MySQL时会报错。Data too long for column '......' at row 1

解决方法

将数据库字段格式设置为longtext

总结

本需求主要难点在于对于golang核心库方法的掌握,包括上传文件,[]bytes 和 string之间的转换。

整体框架:

一、接收文件/图片接口
二、修改/保存图片的接口
三、保存数据的方法

推荐阅读