golang實現(xiàn)文件上傳并轉存數(shù)據(jù)庫功能
本文實例為大家分享了golang實現(xiàn)文件上傳并轉存數(shù)據(jù)庫的具體代碼,供大家參考,具體內(nèi)容如下
需求
上傳圖片,且可選擇將圖片保存到數(shù)據(jù)中。
一、流程圖

二、步驟
1.上傳文件接口
獲取文件,并返回base64string流
代碼如下(示例):
func setIconPost(c *gin.Context) ?{
?? ?//獲取文件,icon實現(xiàn)對上傳文件的訪問,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的數(shù)據(jù)存入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.存儲數(shù)據(jù)
代碼如下(示例):
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.存儲的數(shù)據(jù)庫操作
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
?? ?//數(shù)據(jù)庫是否存在
?? ?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.優(yōu)化
若上傳圖片稍大,在轉存MySQL時會報錯。
Data too long for column '......' at row 1
解決方法
將數(shù)據(jù)庫字段格式設置為longtext
總結
本需求主要難點在于對于golang核心庫方法的掌握,包括上傳文件,[]bytes 和 string之間的轉換。
整體框架:
一、接收文件/圖片接口
二、修改/保存圖片的接口
三、保存數(shù)據(jù)的方法
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

