学习笔记:beego文件的上传,包括图片

文件的上传

首先我从官方文档中摘抄了beego上传文件的一些内容,可以更好地帮助理解

在 beego 中你可以很容易的处理文件上传,就是别忘记在你的 form 表单中增加这个属性 enctype="multipart/form-data",否则你的浏览器不会传输你的上传文件。

文件上传之后一般是放在系统的内存里面,如果文件的 size 大于设置的缓存内存大小,那么就放在临时文件中,默认的缓存内存是 64M,你可以通过如下来调整这个缓存内存大小:

beego.MaxMemory = 1<<22

或者在配置文件中通过如下设置:

maxmemory = 1<<22

Beego 提供了两个很方便的方法来处理文件上传:

  1. GetFile(key string) (multipart.File, *multipart.FileHeader, error)

    该方法主要用于用户读取表单中的文件名 the_file,然后返回相应的信息,用户根据这些变量来处理文件上传:过滤、保存文件等。

  2. SaveToFile(fromfile, tofile string) error

该方法是在 GetFile 的基础上实现了快速保存的功能
fromfile 是提交时候的 html 表单中的 name

"multipart/form-data" method="post"> type="file" name="uploadname" /> type="submit">

保存的代码例子如下:

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"
}

你可能感兴趣的:(beego)