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

AWS S3 v3 API不再返回对象Location URL该如何获取?

AWS S3 JS SDK v3 获取对象访问URL方案

AWS SDK for JavaScript v3 没有在PutObjectCommand、Upload的返回值中内置拼接好的Location字段,这部分逻辑从核心SDK中拆分到了独立工具包中,你可以选择官方工具生成,也可以自行拼接URL。


方案1:使用官方工具生成URL(推荐)

推荐使用官方提供的@aws-sdk/s3-request-presigner工具包生成URL,该方法会自动适配你的S3客户端配置(包括LocalStack自定义端点、路径风格配置等),无需手动处理规则:

  1. 调用逻辑示例:
import { S3Client, GetObjectCommand } from "@aws-sdk/client-s3";
import { getSignedUrl } from "@aws-sdk/s3-request-presigner";

// 初始化S3客户端,LocalStack测试必须配置forcePathStyle为true
const s3Client = new S3Client({
  endpoint: "http://localhost:4566",
  region: "us-east-1",
  credentials: {
    accessKeyId: "test",
    secretAccessKey: "test"
  },
  forcePathStyle: true
});

// 上传对象完成后,传入桶名和对象Key生成访问URL
const getObjectCmd = new GetObjectCommand({
  Bucket: "你的桶名",
  Key: "上传的对象Key"
});

// 生成预签名URL,expiresIn为有效期,单位秒
const accessUrl = await getSignedUrl(s3Client, getObjectCmd, { expiresIn: 3600 });

如果是公共读桶需要生成永久公开URL,直接将expiresIn设置为足够大的数值即可,或者也可以提取预签名URL中问号之前的部分作为永久公开URL。


方案2:手动拼接URL

如果你的场景不需要预签名能力,也可以按照S3的路径规则自行拼接,不同环境规则如下:

  • AWS公有云(路径风格,forcePathStyle=true):https://s3.<region>.amazonaws.com/<bucket-name>/<object-key>
  • AWS公有云(虚拟主机风格,forcePathStyle=false):https://<bucket-name>.s3.<region>.amazonaws.com/<object-key>
  • LocalStack测试环境:http://<LocalStack服务地址>:<端口>/<bucket-name>/<object-key>

注意事项

v2版本SDK返回的Location字段本身就是SDK内部按照上述规则拼接的结果,并非S3服务端原生返回的字段,v3版本将这部分非核心逻辑拆分到独立工具包中,因此默认返回值中没有该字段。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:48:01