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


需求

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

一、流程图

返回base64比特流
上传文件接口
存储图片

二、步骤

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之间的转换。
整体框架:
一、接收文件/图片接口
二、修改/保存图片的接口
三、保存数据的方法

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值