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 = &SysUser{Id: 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 := TestTester{Id: 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
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小阿大:)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值