### 获取 首先要获取的是七牛云官方的SDK ``` go get -u github.com/qiniu/api.v7 ``` ### 七牛云 - [七牛云](https://www.qiniu.com/)没有帐号的去注册一个帐号。 - [个人中心](https://portal.qiniu.com/user/key)有账号的直接进个人中心,去查看秘钥 AccessKey/SecretKey ### 代码 一些常变量 ``` const ( //本地保存的文件夹名称 upload_path string = "/files/" ) var ( //BUCKET是你在存储空间的名称 ACCESS_KEY = "******EA09VCy5EfN_*******************" SECRET_KEY = "******-yvwcYwImN6F*******************" BUCKET = "bucket" ) ``` ##### `WEB`端代码 **获取上传的文件** ``` func uploadHandle(w http.ResponseWriter, r *http.Request) { //从请求当中判断方法 if r.Method == "GET" { tmp, err := template.ParseFiles("templates/upload.html") if err != nil { fmt.Println("模版渲染失败") } tmp.Execute(w, nil) } else { //获取文件内容 要这样获取 file, head, err := r.FormFile("file") if err != nil { fmt.Println(err) return } defer file.Close() //创建文件夹 pwd, _ := os.Getwd() //文件夹存在的话会返回一个错误,可以用`_`抛出去 err = os.Mkdir(pwd+upload_path, os.ModePerm) if err != nil { fmt.Println("dir is create Error") } fW, err := os.Create(pwd + upload_path + head.Filename) if err != nil { fmt.Println("文件创建失败") return } fmt.Println(*fW) defer fW.Close() //复制文件,保存到本地 _, err = io.Copy(fW, file) if err != nil { fmt.Println("文件保存失败") return } //调用七牛上传函数 upload_qiniu(pwd + upload_path + head.Filename) http.Redirect(w, r, "/", http.StatusFound) } } ``` **七牛云上传函数** ``` func upload_qiniu(filePath string) { key := "github-x.png" //上传凭证,关于凭证这块大家可以去看看官方文档 putPolicy := storage.PutPolicy{ Scope: BUCKET, } mac := qbox.NewMac(ACCESS_KEY, SECRET_KEY) upToken := putPolicy.UploadToken(mac) cfg := storage.Config{} //空间对应机房 //其中关于Zone对象和机房的关系如下: // 机房 Zone对象 // 华东 storage.ZoneHuadong // 华北 storage.ZoneHuabei // 华南 storage.ZoneHuanan // 北美 storage.ZoneBeimei //七牛云存储空间设置首页有存储区域 cfg.Zone = &storage.ZoneHuanan //不启用HTTPS域名 cfg.UseHTTPS = false //不使用CND加速 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, filePath, &putExtra) if err != nil { fmt.Println(err) return } fmt.Println(ret.Key, ret.Hash) } ``` + **整个代码实现主要的是存储在本地的路径,然后在上传函数里面读取路径上传文件** + **可能还会有其他的方便,快捷的方法,我也还在摸索中,这个算是这几天学习的一个总结,后续还会修改代码,做一些扩展** + [完整代码地址](https://github.com/ma1ive/Go/blob/master/qiniu/main.go)