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传入再编码成图片存放的主要内容,如果未能解决你的问题,请参考以下文章

将图片转成base64写进hml,无需依赖本地文件

php 将图片转成base64

通过http方式传递base64图片字符串无法还原成图片

mui开发app之js将base64转图片文件

将input type="file" 类型的图片文件转成base64

将图片转成数据:image/png;base64用于网页显示