You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Golang AWS SDK v2获取未签名的S3对象下载URL

获取AWS S3对象下载链接(SDK v2替代GetRequestObject方案)

AWS SDK v2确实移除了GetRequestObject方法,要获取S3对象的下载链接,分两种场景处理:

1. 公开可读的S3对象

如果对象所在存储桶或对象本身配置了公开可读权限,直接构造静态URL即可:

https://<你的桶名>.s3.<区域>.amazonaws.com/<对象键>

注意:对象键包含特殊字符(如空格、中文)时,需要进行URL编码,比如空格替换为%20。

2. 私有S3对象(生成预签名URL)

私有对象需要生成带临时权限的预签名URL,SDK v2可通过PresignClient实现:

完整代码示例

package main

import (
	"context"
	"fmt"
	"time"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/s3"
	"github.com/aws/aws-sdk-go-v2/aws/presigner"
)

func main() {
	bucket := "your-bucket-name"
	key := "your-object-key"
	region := "your-region" // 示例:us-east-1

	// 加载AWS配置
	cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion(region))
	if err != nil {
		panic(fmt.Sprintf("加载配置失败: %v", err))
	}

	// 创建S3客户端
	s3Client := s3.NewFromConfig(cfg)

	// 创建预签名客户端
	presignClient := presigner.NewPresignClient(s3Client)

	// 构造GetObject请求参数
	input := &s3.GetObjectInput{
		Bucket: aws.String(bucket),
		Key:    aws.String(key),
	}

	// 生成预签名URL,设置过期时间(示例为15分钟)
	presignResult, err := presignClient.PresignGetObject(context.TODO(), input, func(opts *s3.PresignOptions) {
		opts.Expires = time.Duration(15) * time.Minute
	})
	if err != nil {
		panic(fmt.Sprintf("生成预签名URL失败: %v", err))
	}

	// 输出下载链接
	fmt.Println("私有对象下载链接:", presignResult.URL)
}

关键说明

  • 预签名URL的过期时间可按需调整,最长不超过7天(受限于AWS IAM角色有效期)
  • 确保运行代码的环境拥有S3:GetObject权限
  • 若使用自定义域名或S3加速端点,需在创建客户端时配置对应端点参数

内容的提问来源于stack exchange,提问作者AC.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:10:25