一架梯子,一头程序猿,仰望星空!

beego文件上传和下载


本章主要介绍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")
}