package osssvr import ( "context" "fmt" "io" "git.wenlab.co/joe/kettle/oss" "github.com/qiniu/go-sdk/v7/auth/qbox" "github.com/qiniu/go-sdk/v7/storage" ) const ( DEF_REGION = storage.RIDHuabei ) type QiniuOption func(*QiniuOss) func WithHTTPS(use bool) QiniuOption { return func(qo *QiniuOss) { qo.https = use } } func WithCDN(use bool) QiniuOption { return func(qo *QiniuOss) { qo.cdn = use } } func WithRegion(region storage.RegionID) QiniuOption { return func(qo *QiniuOss) { qo.region = region } } func NewQiniuOss(accessKey, secretKey, bucket string, opts ...QiniuOption) oss.IOss { qiniu := &QiniuOss{ accessKey: accessKey, secretKey: secretKey, bucket: bucket, region: DEF_REGION, https: false, cdn: false, } for _, opt := range opts { opt(qiniu) } return qiniu } type QiniuOss struct { accessKey, secretKey string bucket string region storage.RegionID https bool cdn bool } type qiniuUploadReturn struct { Key, Hash string Fsize int Bucket, Name string } func (self *QiniuOss) UploadFile(absPath string, key string, conf *oss.UploadConf) (string, error) { scope := self.bucket if conf != nil && conf.Overwrite { scope = fmt.Sprintf("%s:%s", self.bucket, key) } putPolicy := storage.PutPolicy{ Scope: scope, ReturnBody: `{"key":"$(key)", "hash":"$(etag)", "fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}`, } mac := qbox.NewMac(self.accessKey, self.secretKey) upToken := putPolicy.UploadToken(mac) zone, found := storage.GetRegionByID(self.region) if !found { } cfg := storage.Config{ Zone: &zone, UseHTTPS: self.https, UseCdnDomains: self.cdn, } formUploader := storage.NewFormUploader(&cfg) putExtra := storage.PutExtra{} ret := qiniuUploadReturn{} err := formUploader.PutFile(context.Background(), &ret, upToken, key, absPath, &putExtra) //fmt.Printf("%v\n", ret) return ret.Key, err } func (self *QiniuOss) Upload(reader io.Reader, len int64, key string, conf *oss.UploadConf) (string, error) { scope := self.bucket if conf != nil && conf.Overwrite { scope = fmt.Sprintf("%s:%s", self.bucket, key) } putPolicy := storage.PutPolicy{ Scope: scope, ReturnBody: `{"key":"$(key)", "hash":"$(etag)", "fsize":$(fsize),"bucket":"$(bucket)","name":"$(x:name)"}`, } mac := qbox.NewMac(self.accessKey, self.secretKey) upToken := putPolicy.UploadToken(mac) zone, found := storage.GetRegionByID(self.region) if !found { } cfg := storage.Config{ Zone: &zone, UseHTTPS: self.https, UseCdnDomains: self.cdn, } formUploader := storage.NewFormUploader(&cfg) putExtra := storage.PutExtra{} ret := qiniuUploadReturn{} err := formUploader.Put(context.Background(), &ret, upToken, key, reader, len, &putExtra) return ret.Key, err } func (self *QiniuOss) Delete(key string) error { mac := qbox.NewMac(self.accessKey, self.secretKey) cfg := storage.Config{ UseHTTPS: false, } bucketManager := storage.NewBucketManager(mac, &cfg) return bucketManager.Delete(self.bucket, key) } func (self *QiniuOss) Exists(key string) bool { mac := qbox.NewMac(self.accessKey, self.secretKey) cfg := storage.Config{ UseHTTPS: false, } bucketManager := storage.NewBucketManager(mac, &cfg) fileInfo, err := bucketManager.Stat(self.bucket, key) return len(fileInfo.Hash) > 0 && err == nil }