参考文章:
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
}