學習筆記:beego檔案的上傳,包括圖片
檔案的上傳
首先我從官方文件中摘抄了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
<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"
}