前言

Amazon S3
&Expires&X-Amz-Expires

实操

S3 Client
endpointUsePathStyletruehttp://{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

}

参考