go中继承接口就要实现接口中的所有方法,否则就算没有继承接口!!!

MENU

S3对象存储获取预签名URL | Golang

May 11, 2022 • Read: 778 • 学习

前言

最近学习使用对象存储,自然要学习一下 Amazon S3,同时最近学了一下Golang,简单记录一下学习使用 AWS SDK for Go V2 生成文件预签名URL,

预签名:有些时候需要给别人访问对象存储中的对象,又不想给对方桶的权限来访问,就可以通过生成预签名URL给别人临时访问对象。官方目前是有两个签名版本SigV2-带参数&Expires-1年 和SigV4带参数-&X-Amz-Expires-7天,考虑到安全性和使用效率等因素,目前官方已停止SigV2版本的支持。

实操

首先创建 S3 Client 对象,在写代码的过程中,我发现Golang的SDK V2版本和其他语言包括Go的V1版本在创建client对象的时候都有不小的区别,我写的仅作参考

针对自建的对象存储服务器,使用endpoint时注意UsePathStyle true,不然会出现http://{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, err
    }

    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
}

参考

本文作者:ZGGSONG
本文链接:https://www.zggsong.cn/archives/gostudy_s3_object_url.html
版权声明:本站所有未注明转载的文章均为原创,并采用CC BY-NV-SA 4.0授权协议,转载请注明来源

Last Modified: June 15, 2022
Archives QR Code Tip
QR Code for this page
Tipping QR Code
Leave a Comment

3 Comments
  1. 旺仔小可爱 旺仔小可爱

    您好~我是腾讯云+社区的运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
    作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物

  2. swj swj

    测试评论

    1. @swj测试回复