|
|
@ -8,6 +8,7 @@ import (
|
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
|
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
|
|
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
|
|
|
"github.com/aws/aws-sdk-go/aws/session"
|
|
|
|
"github.com/aws/aws-sdk-go/aws/session"
|
|
|
|
|
|
|
|
"github.com/aws/aws-sdk-go/service/s3"
|
|
|
|
"github.com/aws/aws-sdk-go/service/s3/s3manager"
|
|
|
|
"github.com/aws/aws-sdk-go/service/s3/s3manager"
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
@ -15,6 +16,10 @@ type uploader interface {
|
|
|
|
UploadWithContext(ctx aws.Context, input *s3manager.UploadInput, opts ...func(*s3manager.Uploader)) (*s3manager.UploadOutput, error)
|
|
|
|
UploadWithContext(ctx aws.Context, input *s3manager.UploadInput, opts ...func(*s3manager.Uploader)) (*s3manager.UploadOutput, error)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type downloader interface {
|
|
|
|
|
|
|
|
DownloadWithContext(ctx aws.Context, w io.WriterAt, input *s3.GetObjectInput, opts ...func(*s3manager.Downloader)) (n int64, err error)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// S3Client is a client for uploading data to S3.
|
|
|
|
// S3Client is a client for uploading data to S3.
|
|
|
|
type S3Client struct {
|
|
|
|
type S3Client struct {
|
|
|
|
region string
|
|
|
|
region string
|
|
|
@ -71,3 +76,26 @@ func (s *S3Client) Upload(ctx context.Context, reader io.Reader) error {
|
|
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Download downloads data from S3.
|
|
|
|
|
|
|
|
func (s *S3Client) Download(ctx context.Context, writer io.WriterAt) error {
|
|
|
|
|
|
|
|
sess, err := session.NewSession(&aws.Config{
|
|
|
|
|
|
|
|
Region: aws.String(s.region),
|
|
|
|
|
|
|
|
Credentials: credentials.NewStaticCredentials(s.accessKey, s.secretKey, ""),
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return fmt.Errorf("failed to create S3 session: %w", err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
downloader := s3manager.NewDownloader(sess)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
_, err = downloader.DownloadWithContext(ctx, writer, &s3.GetObjectInput{
|
|
|
|
|
|
|
|
Bucket: aws.String(s.bucket),
|
|
|
|
|
|
|
|
Key: aws.String(s.key),
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return fmt.Errorf("failed to download from %s: %w", s, err)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
|
|
|
|
}
|
|
|
|