package providers import ( "context" "fmt" "github.com/qiniu/go-sdk/v7/auth/qbox" "github.com/qiniu/go-sdk/v7/storage" "io" "one.com/kettle/oss" ) const ( QINIU_REGION_HUANAN = storage.RIDHuanan ) func NewQiniuOss(accessKey, secretKey, bucket string, region storage.RegionID) oss.IOss { return &qiniuOss{ accessKey: accessKey, secretKey: secretKey, bucket: bucket, region: region, } } type qiniuOss struct { accessKey, secretKey string bucket string region storage.RegionID } 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: false, UseCdnDomains: false, } formUploader := storage.NewFormUploader(&cfg) putExtra := storage.PutExtra{} ret := qiniuUploadReturn{} err := formUploader.PutFile(context.Background(), &ret, upToken, key, absPath, &putExtra) return ret.Name, 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: false, UseCdnDomains: false, } formUploader := storage.NewFormUploader(&cfg) putExtra := storage.PutExtra{} ret := qiniuUploadReturn{} err := formUploader.Put(context.Background(), &ret, upToken, key, reader, len, &putExtra) return ret.Name, 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, error) { 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 }