97 lines
2.2 KiB
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)
|
|
}
|