前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >S3对象存储获取预签名URL | Golang

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

作者头像
ZGGSONG
发布2022-09-09 10:52:40
2.2K1
发布2022-09-09 10:52:40
举报
文章被收录于专栏:日志

前言

最近学习使用对象存储,自然要学习一下 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时注意UsePathStyletrue,不然会出现http://{bucket}.{endpoint}错误

代码语言:javascript
复制
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
}

如下是主要主要代码

代码语言:javascript
复制
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授权协议,转载请注明来源

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 实操
  • 参考
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档