接着上篇来写《和lock一块儿学beego 博客系统开发为例(六)》html
这篇主要完成如下事项:git
下篇咱们要完成下面三个任务:github
一、单图上传json
二、多图上传ui
关于图片上传的功能介绍完,博客系统基本开发流程也要结束了。下一篇会把简易博客发布到github上去,让新手参考~this
本节准备就写一个图片上传功能的,但在beego里,单图与多图上传处理稍有不一样。在这里分开介绍。url
1、单图上传.net
在控制器文件夹,default.go下:code
//单文件上传 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”来保存。htm
上传的路由:
beego.Router("/upload", &controllers.UploadController{})
模板:
<input id="imgFile" name="imgFile" type="file" />
2、多图上传
//多文件上传 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{})
模板:
<input id="albumUpload" name="uploadFiles" type="file" multiple class="file-loading" data-allowed-file-extensions='["jpg", "jpeg", "png", "gif"]'>
好了,到此博客系统开发的讲解结束了,下篇把github地址公开,顺便截几张预览图片放出来~