package qiniu import ( "context" "fmt" "git.bvbej.com/bvbej/base-golang/pkg/md5" "github.com/qiniu/go-sdk/v7/auth/qbox" "github.com/qiniu/go-sdk/v7/storage" "net/http" "net/url" "strings" "time" ) var _ QiNiu = (*qiNiu)(nil) type QiNiu interface { i() GetUploadToken(ttl uint64) string GetPrivateURL(key string, ttl uint64) string VerifyCallback(req *http.Request) (bool, error) UploadFile(key, localFile string, zone *storage.Region) (*storage.PutRet, error) DelFile(key string, zone *storage.Region) error TimestampSecuritySign(path string, ttl time.Duration) string } type qiNiu struct { mac *qbox.Mac bucket string domain string securityKey string md5 md5.MD5 } type PutRet struct { Key string `json:"key"` Hash string `json:"hash"` Fsize int `json:"fsize"` } func New(accessKey, secretKey, bucket, domain, securityKey string) QiNiu { return &qiNiu{ mac: qbox.NewMac(accessKey, secretKey), bucket: bucket, domain: domain, securityKey: securityKey, md5: md5.New(), } } func (q *qiNiu) i() {} func (q *qiNiu) GetUploadToken(ttl uint64) string { putPolicy := storage.PutPolicy{ Scope: q.bucket, Expires: ttl, } return putPolicy.UploadToken(q.mac) } func (q *qiNiu) GetPrivateURL(key string, ttl uint64) string { deadline := time.Now().Add(time.Second * time.Duration(ttl)).Unix() return storage.MakePrivateURL(q.mac, q.domain, key, deadline) } func (q *qiNiu) VerifyCallback(req *http.Request) (bool, error) { return q.mac.VerifyCallback(req) } func (q *qiNiu) UploadFile(key, localFile string, zone *storage.Region) (*storage.PutRet, error) { upToken := q.GetUploadToken(60) cfg := storage.Config{ Zone: zone, //空间对应的机房 UseHTTPS: true, //是否使用https域名 UseCdnDomains: true, //上传是否使用CDN上传加速 } //构建表单上传的对象 formUploader := storage.NewFormUploader(&cfg) ret := &storage.PutRet{} // 可选配置 putExtra := storage.PutExtra{} err := formUploader.PutFile(context.Background(), ret, upToken, key, localFile, &putExtra) if err != nil { return nil, err } return ret, nil } func (q *qiNiu) DelFile(key string, zone *storage.Region) error { cfg := storage.Config{ Zone: zone, //空间对应的机房 UseHTTPS: true, //是否使用https域名 UseCdnDomains: true, //上传是否使用CDN上传加速 } bucketManager := storage.NewBucketManager(q.mac, &cfg) err := bucketManager.Delete(q.bucket, key) if err != nil { return err } return nil } func (q *qiNiu) TimestampSecuritySign(path string, ttl time.Duration) string { sep := "/" path = strings.Trim(path, sep) splits := strings.Split(path, sep) for i, split := range splits { splits[i] = url.QueryEscape(split) } path = sep + strings.Join(splits, sep) unix := time.Now().Add(ttl).Unix() hex := fmt.Sprintf("%x", unix) encrypt := q.md5.Encrypt(q.securityKey + path + hex) param := make(url.Values) param.Set("sign", encrypt) param.Set("t", hex) return param.Encode() }