和lock一塊兒學beego 博客系統開發爲例(七)

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

相關文章
相關標籤/搜索