2023-02-13 19:36:48 +08:00
|
|
|
package s3
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"io"
|
2024-01-29 21:12:29 +08:00
|
|
|
"time"
|
2023-02-13 19:36:48 +08:00
|
|
|
|
|
|
|
"github.com/aws/aws-sdk-go-v2/aws"
|
2023-02-24 00:02:51 +08:00
|
|
|
s3config "github.com/aws/aws-sdk-go-v2/config"
|
2023-02-13 19:36:48 +08:00
|
|
|
"github.com/aws/aws-sdk-go-v2/credentials"
|
|
|
|
"github.com/aws/aws-sdk-go-v2/feature/s3/manager"
|
|
|
|
awss3 "github.com/aws/aws-sdk-go-v2/service/s3"
|
2024-01-29 23:15:47 +08:00
|
|
|
"github.com/pkg/errors"
|
2023-02-13 19:36:48 +08:00
|
|
|
)
|
|
|
|
|
2024-01-29 21:12:29 +08:00
|
|
|
const LinkLifetime = 24 * time.Hour
|
|
|
|
|
2023-02-24 00:02:51 +08:00
|
|
|
type Config struct {
|
2024-04-28 21:36:22 +08:00
|
|
|
AccessKeyID string
|
|
|
|
AcesssKeySecret string
|
|
|
|
Endpoint string
|
|
|
|
Region string
|
|
|
|
Bucket string
|
2023-02-24 00:02:51 +08:00
|
|
|
}
|
|
|
|
|
2023-02-13 19:36:48 +08:00
|
|
|
type Client struct {
|
2023-02-24 00:02:51 +08:00
|
|
|
Client *awss3.Client
|
|
|
|
Config *Config
|
2023-02-13 19:36:48 +08:00
|
|
|
}
|
|
|
|
|
2023-02-24 00:02:51 +08:00
|
|
|
func NewClient(ctx context.Context, config *Config) (*Client, error) {
|
2023-03-18 22:34:22 +08:00
|
|
|
resolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...any) (aws.Endpoint, error) {
|
2023-02-13 19:36:48 +08:00
|
|
|
return aws.Endpoint{
|
2024-04-28 21:36:22 +08:00
|
|
|
URL: config.Endpoint,
|
2023-02-13 19:36:48 +08:00
|
|
|
}, nil
|
|
|
|
})
|
2024-04-28 21:36:22 +08:00
|
|
|
s3Config, err := s3config.LoadDefaultConfig(ctx,
|
2023-02-24 00:02:51 +08:00
|
|
|
s3config.WithEndpointResolverWithOptions(resolver),
|
2024-04-28 21:36:22 +08:00
|
|
|
s3config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(config.AccessKeyID, config.AcesssKeySecret, "")),
|
2024-01-04 20:08:54 +09:00
|
|
|
s3config.WithRegion(config.Region),
|
2023-02-13 19:36:48 +08:00
|
|
|
)
|
|
|
|
if err != nil {
|
2024-04-28 21:36:22 +08:00
|
|
|
return nil, errors.Wrap(err, "failed to load s3 config")
|
2023-02-13 19:36:48 +08:00
|
|
|
}
|
|
|
|
|
2024-04-28 21:36:22 +08:00
|
|
|
client := awss3.NewFromConfig(s3Config)
|
2023-02-13 19:36:48 +08:00
|
|
|
return &Client{
|
2023-02-24 00:02:51 +08:00
|
|
|
Client: client,
|
|
|
|
Config: config,
|
2023-02-13 19:36:48 +08:00
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
2023-02-24 00:02:51 +08:00
|
|
|
func (client *Client) UploadFile(ctx context.Context, filename string, fileType string, src io.Reader) (string, error) {
|
2023-02-13 19:36:48 +08:00
|
|
|
uploader := manager.NewUploader(client.Client)
|
2023-11-24 21:55:09 +08:00
|
|
|
putInput := awss3.PutObjectInput{
|
2023-02-24 00:02:51 +08:00
|
|
|
Bucket: aws.String(client.Config.Bucket),
|
2023-03-06 20:04:19 +08:00
|
|
|
Key: aws.String(filename),
|
2023-02-13 19:36:48 +08:00
|
|
|
Body: src,
|
|
|
|
ContentType: aws.String(fileType),
|
2023-11-23 23:20:11 +08:00
|
|
|
}
|
2023-11-24 21:55:09 +08:00
|
|
|
uploadOutput, err := uploader.Upload(ctx, &putInput)
|
2023-02-13 19:36:48 +08:00
|
|
|
if err != nil {
|
2023-02-15 22:54:46 +08:00
|
|
|
return "", err
|
2023-02-13 19:36:48 +08:00
|
|
|
}
|
2023-02-27 21:26:50 +08:00
|
|
|
|
|
|
|
link := uploadOutput.Location
|
2023-03-04 20:06:32 +08:00
|
|
|
if link == "" {
|
2023-09-17 22:55:13 +08:00
|
|
|
return "", errors.New("failed to get file link")
|
2023-03-04 20:06:32 +08:00
|
|
|
}
|
2023-02-15 22:54:46 +08:00
|
|
|
return link, nil
|
2023-02-13 19:36:48 +08:00
|
|
|
}
|