Beego文件上传至七牛云的弄法

《Beego文件上传至七牛云的弄法》

我终身的文章都邑放在这里,我的博客,我愿望每一行代码,每一段笔墨都能协助你。
https://github.com/CrazyCodes…

媒介

《Beego文件上传至七牛云的弄法》

Beego是一款GO言语开辟的传统MVC的框架,beego对上传这块的代码封装的也异常简朴易用。

beego的上传

贴出官方的一段代码

https://beego.me/docs/mvc/con…

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" 能够经由过程其第二个返回值取得文件的细致细致

h.Filename
h.Header
h.size

上面的例子是一个传统上传,既将文件拷贝到当地项目目次中。

七牛云

关于注册、登录、猎取key什么的本文就不空话了。官方供应了Go的Sdk

文档地点:https://developer.qiniu.com/k…

装置

经由过程go get 装置包

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也许可你自定义返回效果,经由过程重写构造体的体式格局

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都是写接口。所以上传文件时不该先传到当地再传到七牛,我想许多初学者都在这里被坑。特此写一篇来诠释其运用要领。

愿望本篇文章能够帮到你。感谢

    原文作者:CrazyCodes
    原文地址: https://segmentfault.com/a/1190000017761515
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞