package storage import ( "context" "errors" "net/url" "time" "github.com/spf13/cast" ) type ObjectStorage interface { // 获取上传对象预签名URL PresignedPutObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) // 获取访问对象预签名URL PresignedGetObject(ctx context.Context, objectName string, expires time.Duration) (u *url.URL, err error) // 移动对象 MoveObject(ctx context.Context, src, dst string) error // 检查文件是否存在 ObjectExists(ctx context.Context, objectName string) (bool, error) } func NewObjectStorage(dsn string) (ObjectStorage, error) { u, err := url.Parse(dsn) if err != nil { return nil, err } user := u.User.Username() pass, _ := u.User.Password() switch u.Scheme { case "cos": // ex: cos://examplebucket-1250000000.cos.COS_REGION.myqcloud.com return newCosStorage(u.Host, user, pass) case "minio": // ex: minio://minio-api:9001?secure=false&bucket=images secure := cast.ToBool(u.Query().Get("secure")) bucket := u.Query().Get("bucket") return newMinioStorage(u.Host, user, pass, secure, bucket) default: return nil, errors.New("the storage type not support yet") } }