golang實(shí)現(xiàn)文件上傳并轉(zhuǎn)存數(shù)據(jù)庫(kù)功能
本文實(shí)例為大家分享了golang實(shí)現(xiàn)文件上傳并轉(zhuǎn)存數(shù)據(jù)庫(kù)的具體代碼,供大家參考,具體內(nèi)容如下
需求
上傳圖片,且可選擇將圖片保存到數(shù)據(jù)中。
一、流程圖
二、步驟
1.上傳文件接口
獲取文件,并返回base64string流
代碼如下(示例):
func setIconPost(c *gin.Context) ?{ ?? ?//獲取文件,icon實(shí)現(xiàn)對(duì)上傳文件的訪問(wèn),header是對(duì)上傳文件信息的標(biāo)記 ?? ?icon,header,err :=c.Request.FormFile("file") ?? ?dangerous(err) ?? ?defer icon.Close() ?? ?//path.Ext是取后綴,Tolower小寫(xiě) ?? ?ext := strings.ToLower(path.Ext(header.Filename)) ?? ?if header.Size>1024*1024*2{ ?? ??? ?fmt.Println("文件過(guò)大") ?? ?} ?? ?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.存儲(chǔ)數(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.存儲(chǔ)的數(shù)據(jù)庫(kù)操作
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ù)庫(kù)是否存在 ?? ?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)化
若上傳圖片稍大,在轉(zhuǎn)存MySQL時(shí)會(huì)報(bào)錯(cuò)。
Data too long for column '......' at row 1
解決方法
將數(shù)據(jù)庫(kù)字段格式設(shè)置為longtext
總結(jié)
本需求主要難點(diǎn)在于對(duì)于golang核心庫(kù)方法的掌握,包括上傳文件,[]bytes 和 string之間的轉(zhuǎn)換。
整體框架:
一、接收文件/圖片接口
二、修改/保存圖片的接口
三、保存數(shù)據(jù)的方法
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- golang?MySQL實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表存儲(chǔ)獲取操作示例
- 實(shí)現(xiàn)像php一樣方便的go ORM數(shù)據(jù)庫(kù)操作示例詳解
- Golang連接并操作PostgreSQL數(shù)據(jù)庫(kù)基本操作
- golang連接MongoDB數(shù)據(jù)庫(kù)及數(shù)據(jù)庫(kù)操作指南
- Go語(yǔ)言操作redis數(shù)據(jù)庫(kù)的方法
- Go實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)庫(kù)表轉(zhuǎn)結(jié)構(gòu)體詳解
相關(guān)文章
Go語(yǔ)言中切片使用的注意事項(xiàng)小結(jié)
切片是引用類(lèi)型,相信對(duì)大家來(lái)說(shuō)都不陌生,下面這篇文章主要給大家總結(jié)介紹了關(guān)于Go語(yǔ)言中切片使用的一些注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01golang設(shè)置http response響應(yīng)頭與填坑記錄
這篇文章主要給大家介紹了關(guān)于golang設(shè)置http response響應(yīng)頭與填坑記錄的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08Golang中g(shù)orm無(wú)法將字段更新為空值
本文主要介紹了Golang中g(shù)orm無(wú)法將字段更新為空值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05golang抓取網(wǎng)頁(yè)并分析頁(yè)面包含的鏈接方法
今天小編就為大家分享一篇golang抓取網(wǎng)頁(yè)并分析頁(yè)面包含的鏈接方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08Go語(yǔ)言操作MySql數(shù)據(jù)庫(kù)的詳細(xì)指南
數(shù)據(jù)的持久化是程序中必不可少的,所以編程語(yǔ)言中對(duì)數(shù)據(jù)庫(kù)的操作是非常重要的一塊,這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言操作MySql數(shù)據(jù)庫(kù)的相關(guān)資料,需要的朋友可以參考下2023-10-10go json編譯原理XJSON實(shí)現(xiàn)四則運(yùn)算
這篇文章主要為大家介紹了go json編譯原理XJSON實(shí)現(xiàn)四則運(yùn)算示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07