Beego框架 图片转base64通过JSON传入再编码成图片存放
Posted 一只小阿大:)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Beego框架 图片转base64通过JSON传入再编码成图片存放相关的知识,希望对你有一定的参考价值。
参考文章:
Go后台对图片base64解码,并保存至文件服务器
Go语言中的字符串处理
第一篇文章中有对传入的Base64进行判断,我的没加判断
注意:base64编码的图片前缀data:image/jpeg;base64,“数据”,将base转图片需要把前缀处理掉
业务需求:添加测试员会调用摄像头进行拍照,别人那把图片转成base64,加上员工名和工号以JSON格式传送过来,我这边解析数据,把base64转回图片,并且给它格式化名称,并把这些数据传入数据库,文件保存。再写个get接口给他能请求到该测试员的照片(该接口比较简单就不附上来了)
这样其实有个问题,如果图片很大,那么base64也会很长,不知道会不会出问题。
代码问题:目前知道有两个问题,但不打算处理,更新了测试员照片后,原照片还存在。还有一个是照片要是存放下来了,数据库要没加进去,也会导致照片存在但没用。
下面源码除了POST请求,其他函数我都从其他文件复制过来的,库函数就不复制了。
// Post ...
// @Title Post
// @Description create TestTester
// @Param body body models.TestTester true "body for TestTester content"
// @Success 201 int models.TestTester
// @Failure 403 body is empty
// @router / [post]
func (c *TestTesterController) Post()
var v models.TestTester
var sTester models.TestTester
var updateOrInsterFlag int
if err := json.Unmarshal(c.Ctx.Input.RequestBody, &v); err != nil
c.ErrMsg(err.Error())
//Find out if this person exists in the database
if rSysUser, err := models.GetSysUserById(c.ID); err == nil
if rTesterId := models.GetTesterIdByJobnumManufacturerIdNoName(rSysUser.ManufacturerId, v.TesterJobnum); rTesterId == -2
sTester.TesterManufacturerId = rSysUser.ManufacturerId
updateOrInsterFlag = 1
else
sTester.Id = rTesterId
sTester.TesterManufacturerId = rSysUser.ManufacturerId
updateOrInsterFlag = 2
else
c.ErrMsg("GetSysUserById RSysUser nil", 500)
//Create directory
uploadDir := "static/upload/file/" + time.Now().Format("2006/1/2/")
isExist, existErr := PathExists(uploadDir)
if existErr != nil
c.ErrMsg(existErr.Error())
if isExist == false
errmk := os.MkdirAll(uploadDir, 777)
if errmk != nil
c.ErrMsg(errmk.Error())
//Construction file name
rand.Seed(time.Now().UnixNano())
randNum := fmt.Sprintf("%d", rand.Intn(9999)+1000)
hashName := md5.Sum([]byte(time.Now().Format("2020_02_02_15_04_05_") + randNum))
suffix := ".jpg"
fileDir := uploadDir + fmt.Sprintf("%x", hashName) + suffix
RBase64Point := strings.LastIndex(v.TesterPhoto, ";base64,") + 8
fmt.Println(string(v.TesterPhoto[RBase64Point]))
v.TesterPhoto = v.TesterPhoto[RBase64Point:]
dist, _ := base64.StdEncoding.DecodeString(v.TesterPhoto)
//Write new file
f, _ := os.OpenFile(fileDir, os.O_RDWR|os.O_CREATE, os.ModePerm)
defer f.Close()
f.Write(dist)
sTester.TesterJobnum = v.TesterJobnum
sTester.TesterName = v.TesterName
sTester.TesterPhoto = fileDir
if updateOrInsterFlag == 1
models.AddTestTester(&sTester)
else if updateOrInsterFlag == 2
models.UpdateTestTesterById(&sTester)
else
c.ErrMsg("updateOrInsterFlag error", 500)
c.SuccessData(fileDir)
func GetSysUserById(id int) (v *SysUser, err error)
o := orm.NewOrm()
v = &SysUserId: id
if err = o.Read(v); err == nil
return v, nil
return nil, err
func GetTesterIdByJobnumManufacturerIdNoName(manufacturerid int, testerjobnum string) int
var TestTesters []TestTester
qb, _ := orm.NewQueryBuilder("mysql")
qb.Select("id").
From("test_tester").
Where("tester_manufacturer_id = ?").
And("tester_jobnum = ?")
sql := qb.String()
o := orm.NewOrm()
o.Raw(sql, manufacturerid, testerjobnum).QueryRows(&TestTesters)
if TestTesters == nil
return -2
return TestTesters[0].Id
func PathExists(path string) (bool, error)
_, err := os.Stat(path)
if err == nil
return true, nil
if os.IsNotExist(err)
return false, nil
return false, err
func AddTestTester(m *TestTester) (id int64, err error)
o := orm.NewOrm()
id, err = o.Insert(m)
return
func UpdateTestTesterById(m *TestTester) (err error)
o := orm.NewOrm()
v := TestTesterId: m.Id
// ascertain id exists in the database
if err = o.Read(&v); err == nil
var num int64
if num, err = o.Update(m); err == nil
fmt.Println("Number of records updated in database:", num)
return
以上是关于Beego框架 图片转base64通过JSON传入再编码成图片存放的主要内容,如果未能解决你的问题,请参考以下文章