暂存
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m32s

This commit is contained in:
2026-08-06 09:35:00 +08:00
parent 8659dfc658
commit 88cc5e96ec
75 changed files with 6520 additions and 513 deletions

View File

@@ -59,11 +59,17 @@ func NewS3Provider(cfg *config.StorageConfig) (*S3Provider, error) {
}
func (p *S3Provider) Upload(ctx context.Context, key string, reader io.Reader, contentType string) error {
return p.UploadWithMetadata(ctx, key, reader, contentType, nil)
}
// UploadWithMetadata 上传对象并保存用于完整性复核的 metadata。
func (p *S3Provider) UploadWithMetadata(ctx context.Context, key string, reader io.Reader, contentType string, metadata map[string]string) error {
input := &s3manager.UploadInput{
Bucket: aws.String(p.bucket),
Key: aws.String(key),
Body: reader,
ContentType: aws.String(contentType),
Metadata: aws.StringMap(metadata),
}
_, err := p.uploader.UploadWithContext(ctx, input)
@@ -73,6 +79,26 @@ func (p *S3Provider) Upload(ctx context.Context, key string, reader io.Reader, c
return nil
}
// Stat 读取对象大小、内容类型和 metadata。
func (p *S3Provider) Stat(ctx context.Context, key string) (*ObjectMetadata, error) {
result, err := p.client.HeadObjectWithContext(ctx, &s3.HeadObjectInput{
Bucket: aws.String(p.bucket),
Key: aws.String(key),
})
if err != nil {
return nil, fmt.Errorf("读取对象 metadata 失败: %w", err)
}
metadata := make(map[string]string, len(result.Metadata))
for name, value := range result.Metadata {
metadata[strings.ToLower(name)] = aws.StringValue(value)
}
return &ObjectMetadata{
Size: aws.Int64Value(result.ContentLength),
ContentType: aws.StringValue(result.ContentType),
Metadata: metadata,
}, nil
}
func (p *S3Provider) Download(ctx context.Context, key string) (io.ReadCloser, error) {
input := &s3.GetObjectInput{
Bucket: aws.String(p.bucket),