首先我从官方文档中摘抄了beego上传文件的一些内容,可以更好地帮助理解:
在 beego 中你可以很容易的处理文件上传,就是别忘记在你的 form 表单中增加这个属性 enctype="multipart/form-data"
,否则你的浏览器不会传输你的上传文件。
文件上传之后一般是放在系统的内存里面,如果文件的 size 大于设置的缓存内存大小,那么就放在临时文件中,默认的缓存内存是 64M,你可以通过如下来调整这个缓存内存大小:
beego.MaxMemory = 1<<22
或者在配置文件中通过如下设置:
maxmemory = 1<<22
Beego 提供了两个很方便的方法来处理文件上传:
GetFile(key string) (multipart.File, *multipart.FileHeader, error)
该方法主要用于用户读取表单中的文件名 the_file
,然后返回相应的信息,用户根据这些变量来处理文件上传:过滤、保存文件等。
SaveToFile(fromfile, tofile string) error
该方法是在 GetFile 的基础上实现了快速保存的功能
fromfile 是提交时候的 html 表单中的 name
保存的代码例子如下:
func (c *FormController) Post() {
f, h, err := c.GetFile("uploadname")
if err != nil {
log.Fatal("getfile err ", err)
}
defer f.Close()
c.SaveToFile("uploadname", "static/upload/" + h.Filename) // 保存位置在 static/upload, 没有文件夹要先创建
}
一、文件的上传
controller文件加下的test.go文件:
package controllers
import (
"github.com/astaxie/beego"
"path"
)
type UploadController struct {
beego.Controller
}
func (this *UploadController) Get() {
this.TplName="upload.html" //显示开始界面
}
func (this *UploadController)Post() {
file, information, err := this.GetFile("file") //返回文件,文件信息头,错误信息
if err != nil {
this.Ctx.WriteString("File retrieval failure")
return
}
defer file.Close() //关闭上传的文件,否则出现临时文件不清除的情况 mmp错了好多次啊
filename := information.Filename //将文件信息头的信息赋值给filename变量
err = this.SaveToFile("file", path.Join("static/upload",filename)) //保存文件的路径。保存在static/upload中 (文件名)
if err != nil {
this.Ctx.WriteString("File upload failed!")
} else {
this.Ctx.WriteString("File upload succeed!") //上传成功后显示信息
}
this.TplName = "upload.html" //停留在当前界面
}
view 文件夹下的 upload.html 文件:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>传文件title>
head>
<body>
<form action="/home" enctype="multipart/form-data" method="post">
<input type="file" name ="file"><br><br>
<input type="submit" value="上传相关文件">
form>
body>
<html>
上面的“name = “file” ”跟之前的file, information, err := this.GetFile("file")
key值对应一致,即都是file,
还有一点,根据官方文档中所说: SaveToFile(fromfile, tofile string) error,该方法是在 GetFile 的基础上实现了快速保存的功能
fromfile 是提交时候的 html 表单中的 name。
routers文件夹下的router.go文件:
package routers
import (
"upfile/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.UploadController{},"*:Get")
beego.Router("/home", &controllers.UploadController{},"*:Post")
}
如果想只上传图片格式的,也很简单,只要在controller文件夹下的test文件稍作改动就可以了,即加一个格式限制条件就成啦!
不多说,上代码:
package controllers
import (
"github.com/astaxie/beego"
"path"
"strings"
)
type UploadController struct {
beego.Controller
}
func (this *UploadController) Get() {
this.TplName="upload.html"
}
func (this *UploadController)Post() {
file, information, err := this.GetFile("file") //返回文件,文件信息头,错误信息
if err != nil {
this.Ctx.WriteString("File retrieval failure")
return
} else {
filename := information.Filename
picture := strings.Split(filename,".") //读取到字符串,并以.符号分隔开
layout := strings.ToLower(picture[len(picture)-1]) //把字母字符转换成小写,非字母字符不做出处理,返回此字符串转换为小写形式的副本。
if layout != "jpg" && layout != "png" && layout != "gif" {
this.Ctx.WriteString("请上传符合格式的图片(png、jpg、gif)")
return //结束整个程序,不执行保存文件
}
err = this.SaveToFile("file",path.Join("static/upload",filename))
if err != nil {
this.Ctx.WriteString("File upload failed!")
} else {
this.Ctx.WriteString("File upload succeed!")
}
}
defer file.Close() //关闭上传的文件,否则出现零食文件不清除的情况
this.TplName = "upload.html"
}