package oss import ( "fmt" "io" "github.com/aliyun/aliyun-oss-go-sdk/oss" "go-dy/internal/config" ) type Client struct { client *oss.Client bucket *oss.Bucket endpoint string bucketName string } func New(cfg config.Config) (*Client, error) { if cfg.OSSEndpoint == "" || cfg.OSSAccessKeyID == "" || cfg.OSSAccessKeySecret == "" || cfg.OSSBucket == "" { return nil, fmt.Errorf("missing OSS config: endpoint/accessKeyID/accessKeySecret/bucket") } c, err := oss.New(cfg.OSSEndpoint, cfg.OSSAccessKeyID, cfg.OSSAccessKeySecret) if err != nil { return nil, err } b, err := c.Bucket(cfg.OSSBucket) if err != nil { return nil, err } return &Client{client: c, bucket: b, endpoint: cfg.OSSEndpoint, bucketName: cfg.OSSBucket}, nil } func (c *Client) Upload(objectKey string, reader io.Reader, contentType string) error { var opts []oss.Option if contentType != "" { opts = append(opts, oss.ContentType(contentType)) } return c.bucket.PutObject(objectKey, reader, opts...) } func (c *Client) PublicURL(objectKey string) string { return fmt.Sprintf("https://%s.%s/%s", c.bucketName, c.endpoint, objectKey) }