前言
Amazon S3&Expires&X-Amz-Expires实操
S3 ClientendpointUsePathStyletruehttp://{bucket}.{endpoint}func GetClient(accesskey, secretkey, endpoint string) (\*s3.Client, error) {
cfg, err := config.LoadDefaultConfig(
context.TODO(),
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(accesskey, secretkey, "")),
// 已弃用
// config.WithEndpointResolver(
// aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) {
// return aws.Endpoint{URL: endpoint}, nil
// })),
config.WithEndpointResolverWithOptions(
aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) {
return aws.Endpoint{URL: endpoint}, nil
})),
config.WithRegion("us-east-1"),
)
if err != nil {
return nil, er
}
client := s3.NewFromConfig(cfg, func(o \*s3.Options) {
o.UsePathStyle = true
o.EndpointOptions.DisableHTTPS = true
})
return client, nil
}如下是主要主要代码
type S3PresignGetObjectAPI interface {
PresignGetObject(
ctx context.Context,
params \*s3.GetObjectInput,
optFns ...func(\*s3.PresignOptions)) (\*v4.PresignedHTTPRequest, error)
}
func GetPresignedURL(c context.Context, api S3PresignGetObjectAPI, input \*s3.GetObjectInput) (\*v4.PresignedHTTPRequest, error) {
return api.PresignGetObject(c, input)
}
// 获取预签名的url
func GetObjectUrl(client \*s3.Client, bucket string, key string) string {
input := &s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
}
psClient := s3.NewPresignClient(client)
resp, err := GetPresignedURL(context.TODO(), psClient, input)
if err != nil {
return ("get url err: " + err.Error())
}
return resp.URL
}