接着上篇來寫《和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地址公開,順便截幾張預覽圖片放出來~