和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地址公开,顺便截几张预览图片放出来~

相关文章
相关标签/搜索