|
- package s3
-
- import (
- "context"
- "io"
-
- "github.com/aws/aws-sdk-go-v2/aws"
- "github.com/aws/aws-sdk-go-v2/service/s3"
- "gitlink.org.cn/cloudream/common/pkgs/logger"
- clitypes "gitlink.org.cn/cloudream/jcs-pub/client/types"
- )
-
- type PublicStore struct {
- Detail *clitypes.UserSpaceDetail
- Bucket string
- cli *s3.Client
- }
-
- func NewPublicStore(detail *clitypes.UserSpaceDetail, cli *s3.Client, bkt string) (*PublicStore, error) {
- return &PublicStore{
- Detail: detail,
- Bucket: bkt,
- cli: cli,
- }, nil
- }
-
- func (s *PublicStore) Write(objPath string, stream io.Reader) error {
- key := objPath
-
- _, err := s.cli.PutObject(context.TODO(), &s3.PutObjectInput{
- Bucket: aws.String(s.Bucket),
- Key: aws.String(key),
- Body: stream,
- })
-
- return err
- }
-
- func (s *PublicStore) Read(objPath string) (io.ReadCloser, error) {
- key := objPath
-
- resp, err := s.cli.GetObject(context.TODO(), &s3.GetObjectInput{
- Bucket: aws.String(s.Bucket),
- Key: aws.String(key),
- })
-
- if err != nil {
- return nil, err
- }
-
- return resp.Body, nil
- }
-
- func (s *PublicStore) List(path string, recursive bool) ([]string, error) {
- key := path
- // TODO 待测试
-
- input := &s3.ListObjectsInput{
- Bucket: aws.String(s.Bucket),
- Prefix: aws.String(key),
- }
-
- if !recursive {
- input.Delimiter = aws.String("/")
- }
-
- var pathes []string
-
- var marker *string
- for {
- input.Marker = marker
- resp, err := s.cli.ListObjects(context.Background(), input)
- if err != nil {
- return nil, err
- }
-
- for _, obj := range resp.Contents {
- pathes = append(pathes, *obj.Key)
- }
-
- if !*resp.IsTruncated {
- break
- }
-
- marker = resp.NextMarker
- }
-
- return pathes, nil
- }
-
- func (s *PublicStore) getLogger() logger.Logger {
- return logger.WithField("PublicStore", "S3").WithField("Storage", s.Detail.Storage.String())
- }
|