我终身的文章都邑放在这里,我的博客,我愿望每一行代码,每一段笔墨都能协助你。
https://github.com/CrazyCodes…
媒介
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都是写接口。所以上传文件时不该先传到当地再传到七牛,我想许多初学者都在这里被坑。特此写一篇来诠释其运用要领。
愿望本篇文章能够帮到你。感谢