kra/pkg/upload/tencent.go

80 lines
1.6 KiB
Go

package upload
import (
"context"
"fmt"
"mime/multipart"
"net/http"
"net/url"
"path"
"github.com/tencentyun/cos-go-sdk-v5"
)
// Tencent 腾讯云COS
type Tencent struct {
Bucket string
Region string
SecretID string
SecretKey string
BaseURL string
PathPrefix string
}
// NewTencent 创建腾讯云COS
func NewTencent(bucket, region, secretID, secretKey, baseURL, pathPrefix string) *Tencent {
return &Tencent{
Bucket: bucket,
Region: region,
SecretID: secretID,
SecretKey: secretKey,
BaseURL: baseURL,
PathPrefix: pathPrefix,
}
}
func (t *Tencent) getClient() *cos.Client {
u, _ := url.Parse(fmt.Sprintf("https://%s.cos.%s.myqcloud.com", t.Bucket, t.Region))
b := &cos.BaseURL{BucketURL: u}
return cos.NewClient(b, &http.Client{
Transport: &cos.AuthorizationTransport{
SecretID: t.SecretID,
SecretKey: t.SecretKey,
},
})
}
// UploadFile 上传文件
func (t *Tencent) UploadFile(file *multipart.FileHeader) (string, string, error) {
client := t.getClient()
// 生成文件名和路径
fileName := GenerateFileName(file.Filename)
filePath := GeneratePath(t.PathPrefix)
key := path.Join(filePath, fileName)
// 打开文件
src, err := file.Open()
if err != nil {
return "", "", err
}
defer src.Close()
// 上传
_, err = client.Object.Put(context.Background(), key, src, nil)
if err != nil {
return "", "", err
}
// 返回访问URL和key
accessURL := t.BaseURL + "/" + key
return accessURL, key, nil
}
// DeleteFile 删除文件
func (t *Tencent) DeleteFile(key string) error {
client := t.getClient()
_, err := client.Object.Delete(context.Background(), key)
return err
}