package handle import ( "allapp-go/internal/errors" "allapp-go/internal/httpx" "allapp-go/pkg/s3store" "fmt" "mime/multipart" "path/filepath" "time" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/gofiber/fiber/v3" "github.com/google/uuid" ) func S3ListBuckets(c fiber.Ctx) error { result, err := s3store.S3Client.ListBuckets(c.Context(), &s3.ListBucketsInput{}) if err != nil { return errors.WithStack(err) } buckets := make([]string, 0, len(result.Buckets)) for _, b := range result.Buckets { if b.Name != nil { buckets = append(buckets, *b.Name) } } return httpx.OK(c, buckets) } func S3UploadFile(c fiber.Ctx) error { fileHeader, err := c.FormFile("file") if err != nil { return errors.WithStack(err) } file, err := fileHeader.Open() if err != nil { return errors.WithStack(err) } defer func(file multipart.File) { _ = file.Close() }(file) // 日期目录 now := time.Now() folderPath := fmt.Sprintf("%d/%02d/%02d", now.Year(), now.Month(), now.Day(), ) // UUID 文件名(保留后缀) ext := filepath.Ext(fileHeader.Filename) newName := fmt.Sprintf("%s%s", uuid.NewString(), ext) // S3 object key key := fmt.Sprintf("%s/%s", folderPath, newName) // ContentType(防止前端乱传) contentType := fileHeader.Header.Get("Content-Type") // 调用存储层 err = s3store.UploadToRustFS( c.Context(), key, file, fileHeader.Size, contentType, ) if err != nil { return errors.WithStack(err) } return httpx.OK(c, nil) }