feat(knowledge): 图片上传接口(S3 存储,限 5MB jpg/png/webp)

This commit is contained in:
weijuesen
2026-08-12 12:12:28 +08:00
parent 8bb93ad5c3
commit c8aa213626
6 changed files with 201 additions and 2 deletions
+28
View File
@@ -6,6 +6,7 @@ import (
"crypto/sha256"
"encoding/hex"
"fmt"
"io"
"net/url"
"os"
"strings"
@@ -151,6 +152,33 @@ func (s *S3Service) UploadFile(bucket, key, filePath string) error {
return err
}
// EnsureBucket 确保 bucket 存在,不存在则创建(幂等)
func (s *S3Service) EnsureBucket(bucket string) error {
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
if _, err := s.client.HeadBucket(ctx, &s3.HeadBucketInput{Bucket: aws.String(bucket)}); err == nil {
return nil
}
_, err := s.client.CreateBucket(ctx, &s3.CreateBucketInput{Bucket: aws.String(bucket)})
return err
}
// UploadImage 上传图片对象(支持指定 Content-Type
func (s *S3Service) UploadImage(bucket, key string, body io.Reader, contentType string) error {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute)
defer cancel()
_, err := s.client.PutObject(ctx, &s3.PutObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
Body: body,
ContentType: aws.String(contentType),
})
return err
}
// Endpoint 返回 S3 endpoint(用于拼接对象公开 URL)
func (s *S3Service) Endpoint() string { return s.endpoint }
// sha256Hex 计算 SHA256 十六进制摘要
func sha256Hex(data string) string {
h := sha256.Sum256([]byte(data))