Golang上传文件到七牛云

4 minute read

最近老大说要在网站的后台里做一个OSS配置,后台写好,图片直接上传到云储存里面,小生不才,查资料看文章,改了N多BUG之后才做了一个基本的上传系统,下面是一些在敲代码中经历的BUG或者对一些方法的见解


获取

首先要获取的是七牛云官方的SDK

1go get -u github.com/qiniu/api.v7

七牛云

  • 七牛云没有帐号的去注册一个帐号。
  • 个人中心有账号的直接进个人中心,去查看秘钥 AccessKey/SecretKey

代码

一些常变量

 1const (
 2	//本地保存的文件夹名称
 3	upload_path string = "/files/"
 4)
 5
 6var (
 7	//BUCKET是你在存储空间的名称
 8	ACCESS_KEY = "******EA09VCy5EfN_*******************"
 9	SECRET_KEY = "******-yvwcYwImN6F*******************"
10	BUCKET     = "bucket"
11)
WEB端代码

获取上传的文件

 1func uploadHandle(w http.ResponseWriter, r *http.Request) {
 2	//从请求当中判断方法
 3	if r.Method == "GET" {
 4		tmp, err := template.ParseFiles("templates/upload.html")
 5		if err != nil {
 6			fmt.Println("模版渲染失败")
 7		}
 8		tmp.Execute(w, nil)
 9	} else {
10		//获取文件内容 要这样获取
11		file, head, err := r.FormFile("file")
12		if err != nil {
13			fmt.Println(err)
14			return
15		}
16		defer file.Close()
17		//创建文件夹
18		pwd, _ := os.Getwd()
19		//文件夹存在的话会返回一个错误,可以用`_`抛出去
20		err = os.Mkdir(pwd+upload_path, os.ModePerm)
21		if err != nil {
22			fmt.Println("dir is create Error")
23		}
24		fW, err := os.Create(pwd + upload_path + head.Filename)
25		if err != nil {
26			fmt.Println("文件创建失败")
27			return
28		}
29		fmt.Println(*fW)
30		defer fW.Close()
31		//复制文件,保存到本地
32		_, err = io.Copy(fW, file)
33		if err != nil {
34			fmt.Println("文件保存失败")
35			return
36		}
37		//调用七牛上传函数
38		upload_qiniu(pwd + upload_path + head.Filename)
39		http.Redirect(w, r, "/", http.StatusFound)
40	}
41}

七牛云上传函数

 1func upload_qiniu(filePath string) {
 2	key := "github-x.png"
 3	//上传凭证,关于凭证这块大家可以去看看官方文档
 4	putPolicy := storage.PutPolicy{
 5		Scope: BUCKET,
 6	}
 7	mac := qbox.NewMac(ACCESS_KEY, SECRET_KEY)
 8	upToken := putPolicy.UploadToken(mac)
 9	cfg := storage.Config{}
10	//空间对应机房
11	//其中关于Zone对象和机房的关系如下:
12	//	机房	Zone对象
13	//	华东	storage.ZoneHuadong
14	//	华北	storage.ZoneHuabei
15	//	华南	storage.ZoneHuanan
16	//	北美	storage.ZoneBeimei
17	//七牛云存储空间设置首页有存储区域
18	cfg.Zone = &storage.ZoneHuanan
19	//不启用HTTPS域名
20	cfg.UseHTTPS = false
21	//不使用CND加速
22	cfg.UseCdnDomains = false
23	//构建上传表单对象
24	formUploader := storage.NewFormUploader(&cfg)
25	ret := storage.PutRet{}
26	// 可选
27	putExtra := storage.PutExtra{
28		Params: map[string]string{
29			"x:name": "github logo",
30		},
31	}
32	err := formUploader.PutFile(context.Background(), &ret, upToken, key, filePath, &putExtra)
33	if err != nil {
34		fmt.Println(err)
35		return
36	}
37	fmt.Println(ret.Key, ret.Hash)
38}
  • 整个代码最主要的是存储在本地的路径,然后在上传函数里面读取路径上传文件
  • 可能还会有其他的方便,快捷的方法,我也还在摸索中,这个算是这几天学习的一个总结,后续还会修改代码,做一些扩展
  • 完整代码地址