feat(knowledge): 图片上传接口(S3 存储,限 5MB jpg/png/webp)
This commit is contained in:
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user