Files
easyai-ai-gateway/apps/api/internal/runner/direct_oss.go
T
wangbo 0f0998cbcf feat(storage): 统一二进制对象存储与公开错误
新增 Aliyun OSS 与 S3 协议、通道内重试和按优先级跨通道切换,保留 server-main 兼容与环境 OSS 内存通道。

将请求及结果中的 Base64、Data URI、Buffer、multipart 和内联二进制统一对象化,生产路径不再写入本机静态目录,历史本地资源仅保留只读兼容。

引入 PublicErrorV1 并统一 API、异步查询、兼容协议和失败回调的安全错误输出,同时补充迁移、管理端、指标、OpenAPI 与本地模拟验收。

验证:go test ./... -count=1;go vet ./...;pnpm lint;pnpm test;pnpm build;pnpm openapi;tests/ci/migrations-test.sh。
2026-08-04 08:14:39 +08:00

68 lines
1.9 KiB
Go

package runner
import (
"strings"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/config"
"github.com/easyai/easyai-ai-gateway/apps/api/internal/store"
)
type directOSSUploader struct {
endpoint string
bucket string
accessKeyID string
accessKeySecret string
publicBaseURL string
objectPrefix string
}
func newDirectOSSUploader(cfg config.Config) *directOSSUploader {
if !cfg.MediaOSSDirectEnabled {
return nil
}
return &directOSSUploader{
endpoint: strings.TrimRight(cfg.MediaOSSEndpoint, "/"),
bucket: strings.TrimSpace(cfg.MediaOSSBucket),
accessKeyID: strings.TrimSpace(cfg.MediaOSSAccessKeyID),
accessKeySecret: strings.TrimSpace(cfg.MediaOSSAccessKeySecret),
publicBaseURL: strings.TrimRight(cfg.MediaOSSPublicBaseURL, "/"),
objectPrefix: strings.Trim(cfg.MediaOSSObjectPrefix, "/"),
}
}
func directOSSScene(scene string) bool {
switch strings.TrimSpace(scene) {
case store.FileStorageSceneUpload, store.FileStorageSceneRequestAsset, store.FileStorageSceneImageResult:
return true
default:
return false
}
}
func (u *directOSSUploader) fileStorageChannel() store.FileStorageChannel {
if u == nil {
return store.FileStorageChannel{}
}
return store.FileStorageChannel{
ChannelKey: "environment-direct-oss",
Name: "Environment Direct OSS",
Provider: "aliyun_oss",
AccessKeyID: u.accessKeyID,
AccessKeySecret: u.accessKeySecret,
Priority: 10,
Status: "enabled",
Scenes: []string{store.FileStorageSceneUpload, store.FileStorageSceneRequestAsset, store.FileStorageSceneImageResult},
Config: map[string]any{
"endpoint": u.endpoint,
"bucket": u.bucket,
"publicBaseUrl": u.publicBaseURL,
"objectPrefix": u.objectPrefix,
},
RetryPolicy: map[string]any{
"enabled": true,
"maxRetries": 2,
"backoffSeconds": []any{0.25, 1.0},
},
}
}