1. 程式人生 > >學習筆記:beego檔案的上傳,包括圖片

學習筆記: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

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

儲存的程式碼例子如下:

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 檔案:

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