kra/pkg/upload/qiniu.go

97 lines
2.2 KiB
Go

package upload
import (
"context"
"mime/multipart"
"path"
"github.com/qiniu/go-sdk/v7/auth/qbox"
"github.com/qiniu/go-sdk/v7/storage"
)
// Qiniu 七牛云
type Qiniu struct {
Zone string
Bucket string
ImgPath string
AccessKey string
SecretKey string
UseHTTPS bool
UseCdnDomains bool
}
// NewQiniu 创建七牛云
func NewQiniu(zone, bucket, imgPath, accessKey, secretKey string, useHTTPS, useCdnDomains bool) *Qiniu {
return &Qiniu{
Zone: zone,
Bucket: bucket,
ImgPath: imgPath,
AccessKey: accessKey,
SecretKey: secretKey,
UseHTTPS: useHTTPS,
UseCdnDomains: useCdnDomains,
}
}
func (q *Qiniu) getZone() *storage.Region {
switch q.Zone {
case "ZoneHuadong":
return &storage.ZoneHuadong
case "ZoneHuabei":
return &storage.ZoneHuabei
case "ZoneHuanan":
return &storage.ZoneHuanan
case "ZoneBeimei":
return &storage.ZoneBeimei
case "ZoneXinjiapo":
return &storage.ZoneXinjiapo
default:
return &storage.ZoneHuadong
}
}
// UploadFile 上传文件
func (q *Qiniu) UploadFile(file *multipart.FileHeader) (string, string, error) {
mac := qbox.NewMac(q.AccessKey, q.SecretKey)
putPolicy := storage.PutPolicy{Scope: q.Bucket}
upToken := putPolicy.UploadToken(mac)
cfg := storage.Config{
Zone: q.getZone(),
UseHTTPS: q.UseHTTPS,
UseCdnDomains: q.UseCdnDomains,
}
formUploader := storage.NewFormUploader(&cfg)
// 生成文件名和路径
fileName := GenerateFileName(file.Filename)
filePath := GeneratePath("")
key := path.Join(filePath, fileName)
// 打开文件
src, err := file.Open()
if err != nil {
return "", "", err
}
defer src.Close()
// 上传
ret := storage.PutRet{}
err = formUploader.Put(context.Background(), &ret, upToken, key, src, file.Size, nil)
if err != nil {
return "", "", err
}
// 返回访问URL和key
accessURL := q.ImgPath + "/" + key
return accessURL, key, nil
}
// DeleteFile 删除文件
func (q *Qiniu) DeleteFile(key string) error {
mac := qbox.NewMac(q.AccessKey, q.SecretKey)
cfg := storage.Config{Zone: q.getZone()}
bucketManager := storage.NewBucketManager(mac, &cfg)
return bucketManager.Delete(q.Bucket, key)
}