本章主要介绍beego如何处理文件的上传和下载。
1.beego处理文件上传
Beego 控制器提供了两个很方便的函数来处理文件上传:
- GetFile(key string) (multipart.File, *multipart.FileHeader, error)
主要用于读取表单中的文件信息,可以根据这些信息来处理文件上传、过滤、保存文件等。 - SaveToFile(fromfile, tofile string) error
这个函数就是用于实现快速保存文件到本地路径
例子:
表单
<form enctype="multipart/form-data" method="post">
<input type="file" name="filename" />
<input type="submit">
</form>
提示:文件上传,表单<form>记得加上enctype="multipart/form-data"属性,否则浏览器不会上传文件。
处理文件上传代码
func (this *UserController) Post() {
// 读取文件信息
f, h, err := this.GetFile("filename")
if err != nil {
log.Fatal("读取文件错误", err)
}
// 延迟关闭文件
defer f.Close()
// 保存文件, 本地文件路径static/upload/上传文件名
// 需要提前创建好static/upload目录
this.SaveToFile("filename", "static/upload/" + h.Filename)
}
如果你不想将文件保存到本地路径,想直接读取文件内容进行处理。
func (this *UserController) Post() {
// 读取文件信息
f, h, err := this.GetFile("filename")
if err != nil {
log.Fatal("读取文件错误", err)
}
// 延迟关闭文件
defer f.Close()
// 读取上传文件内容, data就是文件的内容
// ioutil.ReadAll返回[]byte类型数据
data, err := ioutil.ReadAll(f)
}
2.beego处理文件下载
如果你想实现动态处理文件下载,例如:在文件下载的时候验证下用户的权限,这种情况就不能直接返回一个静态地址给用户。
例子:
func (this *FileController) Get() {
// 业务逻辑处理,例如先检测用户权限
// 下载服务器上当前目录/data/file.zip文件, 下载后的文件名为:压缩包1.zip
this.Ctx.Output.Download("data/file.zip", "压缩包1.zip")
}