我一輩子的文章都會放在這裏,個人博客,我但願每一行代碼,每一段文字都能幫助你。 https://github.com/CrazyCodes...
Beego是一款GO語言開發的傳統MVC的框架,beego對上傳這塊的代碼封裝的也很是簡單易用。php
貼出官方的一段代碼java
https://beego.me/docs/mvc/con...git
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, 沒有文件夾要先建立 }
這裏beego經過 GetFile方法獲取文件的name,既設置的 input name="uploadname"
能夠經過其第二個返回值得到文件的詳細詳細github
h.Filename h.Header h.size
上面的例子是一個傳統上傳,既將文件拷貝到本地項目目錄中。web
關於註冊、登陸、獲取key什麼的本文就不廢話了。官方提供了Go的Sdkjson
文檔地址:https://developer.qiniu.com/k...api
經過go get 安裝包mvc
go get -u github.com/qiniu/api.v7
這裏演示兩種上傳方式
七牛官方的SDK提供了幾個上傳方法,以下所示框架
// 本地文件上傳至七牛雲 func (p *FormUploader) PutFile func (p *FormUploader) PutFileWithoutKey // 數據流方式上傳至七牛雲 func (p *FormUploader) Put func (p *FormUploader) PutWithoutKey
這個SDK也容許你自定義返回結果,經過重寫結構體的方式spa
type PutRet struct { Hash string `json:"hash"` PersistentID string `json:"persistentId"` Key string `json:"key"` }
這是官方的一個demo,本地上傳這裏就很少闡述了,大概都能看懂
// 設置上傳文件 localFile = "/Users/jemy/Documents/github.png" // 設置上傳空間名 bucket = "if-pbl" // 上傳的文件名稱 key = "github-x.png" putPolicy := storage.PutPolicy{ Scope: bucket, } mac := qbox.NewMac(accessKey, secretKey) upToken := putPolicy.UploadToken(mac) cfg := storage.Config{} // 空間對應的機房 cfg.Zone = &storage.ZoneHuadong // 是否使用https域名 cfg.UseHTTPS = false // 上傳是否使用CDN上傳加速 cfg.UseCdnDomains = false // 構建表單上傳的對象 formUploader := storage.NewFormUploader(&cfg) ret := storage.PutRet{} // 可選配置 putExtra := storage.PutExtra{ Params: map[string]string{ "x:name": "github logo", }, } err := formUploader.PutFile(context.Background(), &ret, upToken, key, localFile, &putExtra) if err != nil { fmt.Println(err) return } fmt.Println(ret.Key,ret.Hash)
這是我自行封裝的流上傳代碼
package qiniu import ( "github.com/qiniu/api.v7/storage" "github.com/qiniu/api.v7/auth/qbox" "context" "io" ) const ( bucket = "avatars" // accessKey = "" secretKey = "" ) func config() storage.Config { cfg := storage.Config{} cfg.Zone = &storage.ZoneHuadong // 是否使用https域名 cfg.UseHTTPS = false // 上傳是否使用CDN上傳加速 cfg.UseCdnDomains = false return cfg } func Upload(localFile io.Reader, size int64, filename string) (string, error) { putPolicy := storage.PutPolicy{ Scope: bucket, } mac := qbox.NewMac(accessKey, secretKey) upToken := putPolicy.UploadToken(mac) cig := config() formUploader := storage.NewFormUploader(&cig) ret := storage.PutRet{} putExtra := storage.PutExtra{} err := formUploader.Put(context.Background(), &ret, upToken, filename, localFile, size, &putExtra) if err != nil { return "", err } return ret.Key, nil }
注意localFile io.Reader
這個參數,調用upload方法須要傳一個byte。下面演示調用方法的代碼
func (u *UserController) UploadImage() { f, h, err := u.GetFile("image") if err != nil { u.Data["json"] = common.Response{ Data: [0]int{}, Message: "上傳失敗", Code: 0, } u.ServeJSON() return } defer f.Close() file, _ := h.Open() // 這裏得到的實際就是一個io,經過源碼看到這個open方法最終返回的是一個結構體,其內部包含了 io.Reader的接口 // type File interface { // io.Reader // io.ReaderAt // io.Seeker // io.Closer // } unix := time.Now().Unix() timeByte := []byte(strconv.Itoa(int(unix))) filename := function.Md5(timeByte) // 這裏是計算了一個md5(time())的字符串做爲文件名 if filename, err = qiniu.Upload(file, h.Size, filename); err != nil { // 經過h.size 便可得到文件大小 u.Data["json"] = common.Response{ Data: [0]int{}, Message: "上傳失敗", Code: 0, } } else { u.Data["json"] = common.Response{ Data: map[string]string{ "filename": filename, }, Message: "上傳成功", Code: 200, } } u.ServeJSON() }
go 自身的特色不該是作web,web使用php,java就夠了。通常用go都是寫接口。因此上傳文件時不該先傳到本地再傳到七牛,我想不少初學者都在這裏被坑。特此寫一篇來解釋其使用方法。
但願本篇文章能夠幫到你。謝謝