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
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
|
|
}
|
|
|