接着上篇来写《》
这篇主要完成以下事项:
下篇我们要完成下面三个任务:
1、单图上传
2、多图上传
关于图片上传的功能介绍完,博客系统基本开发流程也要结束了。下一篇会把简易博客发布到github上去,让新手参考~
本节准备就写一个图片上传功能的,但在beego里,单图与多图上传处理稍有不同。在这里分开介绍。
一、单图上传
在控制器文件夹,default.go下:
//单文件上传type UploadController struct { BaseController}func (this *UploadController) Post() { if !this.isLogin { this.Data["json"] = map[string]interface{}{"error": 1, "message": "你没有权限上传"} this.ServeJSON() return } //imgFile f, h, err := this.GetFile("imgFile") defer f.Close() //生成上传路径 now := time.Now() dir := "./static/uploadfile/" + strconv.Itoa(now.Year()) + "-" + strconv.Itoa(int(now.Month())) + "/" + strconv.Itoa(now.Day()) err1 := os.MkdirAll(dir, 0755) if err1 != nil { this.Data["json"] = map[string]interface{}{"error": 1, "message": "目录权限不够"} this.ServeJSON() return } //生成新的文件名 filename := h.Filename ext := utils.SubString(filename, strings.LastIndex(filename, "."), 5) filename = utils.GetGuid() + ext if err != nil { this.Data["json"] = map[string]interface{}{"error": 1, "message": err} } else { //this.SaveToFile("imgFile", "./static/uploadfile/"+h.Filename) this.SaveToFile("imgFile", dir+"/"+filename) this.Data["json"] = map[string]interface{}{"error": 0, "url": strings.Replace(dir, ".", "", 1) + "/" + filename} } this.ServeJSON()}
说明:在beego里获取图片是要用到“GetFile”方法来获取,参数就是input file的名称,上传后我们要创建以日期格式的文件夹来存图片,再把图片以时间格式命名,最后“SaveToFile”来保存。
上传的路由:
beego.Router("/upload", &controllers.UploadController{})
模板:
二、多图上传
//多文件上传type UploadMultiController struct { BaseController}func (this *UploadMultiController) Post() { if !this.isLogin { this.Data["json"] = map[string]interface{}{"code": 0, "message": "你没有权限上传"} this.ServeJSON() return } files, err := this.GetFiles("uploadFiles") if err != nil { this.Data["json"] = map[string]interface{}{"code": 0, "message": "目录权限不够"} this.ServeJSON() return } //生成上传路径 now := time.Now() dir := "./static/uploadfile/" + strconv.Itoa(now.Year()) + "-" + strconv.Itoa(int(now.Month())) + "/" + strconv.Itoa(now.Day()) err1 := os.MkdirAll(dir, 0755) if err1 != nil { this.Data["json"] = map[string]interface{}{"code": 0, "message": "目录权限不够"} this.ServeJSON() return } resfilestr := "" resfilename := "" for i, _ := range files { file, err := files[i].Open() defer file.Close() if err != nil { this.Data["json"] = map[string]interface{}{"code": 0, "message": err} this.ServeJSON() return } //生成新的文件名 filename := files[i].Filename resfilename += utils.GetFileSuffix(filename) + "||" ext := utils.SubString(filename, strings.LastIndex(filename, "."), 5) filename = utils.GetGuid() + ext dst, err := os.Create(dir + "/" + filename) defer dst.Close() if err != nil { this.Data["json"] = map[string]interface{}{"code": 0, "message": err} this.ServeJSON() return } if _, err := io.Copy(dst, file); err != nil { this.Data["json"] = map[string]interface{}{"code": 0, "message": err} this.ServeJSON() return } resfilestr += strings.Replace(dir, ".", "", 1) + "/" + filename + "||" } this.SetSession("uploadMultiPic", resfilestr) this.SetSession("uploadMultiName", resfilename) this.Data["json"] = map[string]interface{}{"code": 1, "message": "上传成功", "url": resfilestr} this.ServeJSON() return}
说明:多图与单图类似,不过用到的方法是“GetFiles”,同样是创建以日期形式的文件夹;因为是多图,所以要for循环获取。
路由:
beego.Router("/uploadmulti", &controllers.UploadMultiController{})
模板:
好了,到此博客系统开发的讲解结束了,下篇把github地址公开,顺便截几张预览图片放出来~