58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
package oss
|
|
|
|
import (
|
|
"ai_scheduler/internal/config"
|
|
"bytes"
|
|
"fmt"
|
|
|
|
"github.com/aliyun/aliyun-oss-go-sdk/oss"
|
|
"github.com/go-kratos/kratos/v2/log"
|
|
)
|
|
|
|
type Client struct {
|
|
config config.Oss
|
|
client *oss.Client
|
|
bucket *oss.Bucket
|
|
}
|
|
|
|
// NewClient 初始化 OSS 客户端
|
|
func NewClient(cfg config.Oss) (*Client, error) {
|
|
client, err := oss.New(cfg.Endpoint, cfg.AccessKey, cfg.SecretKey)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("oss new client failed: %v", err)
|
|
}
|
|
|
|
bucket, err := client.Bucket(cfg.Bucket)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("oss get bucket failed: %v", err)
|
|
}
|
|
|
|
return &Client{
|
|
config: cfg,
|
|
client: client,
|
|
bucket: bucket,
|
|
}, nil
|
|
}
|
|
|
|
// UploadBytes 上传字节数组到 OSS
|
|
// objectKey: OSS 中的文件路径,例如 "ai_scheduler/test.png"
|
|
// fileBytes: 文件内容
|
|
// 返回: 文件的访问 URL
|
|
func (c *Client) UploadBytes(objectKey string, fileBytes []byte) (string, error) {
|
|
err := c.bucket.PutObject(objectKey, bytes.NewReader(fileBytes))
|
|
if err != nil {
|
|
log.Errorf("oss PutObject failed: %v", err)
|
|
return "", err
|
|
}
|
|
|
|
// 构造返回 URL
|
|
var url string
|
|
if c.config.Domain != "" {
|
|
url = fmt.Sprintf("%s/%s", c.config.Domain, objectKey)
|
|
} else {
|
|
// 这里简单处理协议头
|
|
url = fmt.Sprintf("https://%s.%s/%s", c.config.Bucket, c.config.Endpoint, objectKey)
|
|
}
|
|
return url, nil
|
|
}
|