You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

62 lines
1.8 KiB

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
}