package storage import ( "context" "fmt" "io" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/youruser/base/internal/config" ) type OSSStorage struct { bucket *oss.Bucket } func NewOSSStorage(cfg config.OSSStorageConfig) (*OSSStorage, error) { if cfg.Endpoint == "" || cfg.AccessKeyId == "" || cfg.AccessKeySecret == "" || cfg.Bucket == "" { return nil, fmt.Errorf("OSS config incomplete: endpoint, accessKeyId, accessKeySecret, bucket are required") } client, err := oss.New(cfg.Endpoint, cfg.AccessKeyId, cfg.AccessKeySecret) if err != nil { return nil, fmt.Errorf("failed to create OSS client: %w", err) } bucket, err := client.Bucket(cfg.Bucket) if err != nil { return nil, fmt.Errorf("failed to get OSS bucket: %w", err) } return &OSSStorage{bucket: bucket}, nil } func (s *OSSStorage) Upload(ctx context.Context, key string, reader io.Reader, size int64, contentType string) error { options := []oss.Option{ oss.ContentType(contentType), } if err := s.bucket.PutObject(key, reader, options...); err != nil { return fmt.Errorf("failed to upload to OSS: %w", err) } return nil } func (s *OSSStorage) Delete(ctx context.Context, key string) error { if err := s.bucket.DeleteObject(key); err != nil { return fmt.Errorf("failed to delete from OSS: %w", err) } return nil } func (s *OSSStorage) GetURL(ctx context.Context, key string) (string, error) { url, err := s.bucket.SignURL(key, oss.HTTPGet, 3600) if err != nil { return "", fmt.Errorf("failed to generate OSS signed URL: %w", err) } return url, nil } func (s *OSSStorage) Exists(ctx context.Context, key string) (bool, error) { exists, err := s.bucket.IsObjectExist(key) if err != nil { return false, fmt.Errorf("failed to check OSS object: %w", err) } return exists, nil }