最近老大说要在网站的后台里做一个OSS配置,后台写好,图片直接上传到云储存里面,小生不才,查资料看文章,改了N多BUG之后才做了一个基本的上传系统,下面是一些在敲代码中经历的BUG或者对一些方法的见解
获取 🔗
首先要获取的是七牛云官方的SDK
1go get -u github.com/qiniu/api.v7
七牛云 🔗
代码 🔗
一些常变量
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}
- 整个代码最主要的是存储在本地的路径,然后在上传函数里面读取路径上传文件
- 可能还会有其他的方便,快捷的方法,我也还在摸索中,这个算是这几天学习的一个总结,后续还会修改代码,做一些扩展
- 完整代码地址