Beego文件上傳至七牛雲的玩法

我一輩子的文章都會放在這裏,個人博客,我但願每一行代碼,每一段文字都能幫助你。 https://github.com/CrazyCodes...

前言

Beego是一款GO語言開發的傳統MVC的框架,beego對上傳這塊的代碼封裝的也很是簡單易用。php

beego的上傳

貼出官方的一段代碼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都是寫接口。因此上傳文件時不該先傳到本地再傳到七牛,我想不少初學者都在這裏被坑。特此寫一篇來解釋其使用方法。

但願本篇文章能夠幫到你。謝謝

相關文章
相關標籤/搜索