Cesium Ion REST API上传文件至S3报AccessDenied权限错误
Cesium Ion 上传LAS文件到S3报AccessDenied解决方案
你代码里有两个直接触发权限错误的核心问题,按下面改就能解决:
1. 无效的Prefix参数导致上传路径不在授权范围内
AWS SDK v3的上传接口根本不识别顶层Prefix参数,你单独写这个字段完全不会生效。
Cesium Ion返回的临时STS凭证,只允许你往指定前缀的路径下上传文件,你现在的代码实际是往存储桶根目录传文件,完全不在授权路径里,必然被拒绝。
把prefix直接拼到Key字段里就行,注意处理斜杠避免路径拼接错误:
const params = { Bucket: uploadLocation.bucket, // 删除无效的Prefix配置,拼接前缀到Key Key: `${uploadLocation.prefix.replace(/\/$/, '')}/${selectedFile.name}`, Body: selectedFile };
2. 硬编码区域导致签名校验失败
你代码里写死了region: 'us-east-1',但Cesium Ion会根据资产的实际存储位置返回对应区域的上传信息,uploadLocation对象本身就携带region字段,硬编码区域会导致v4签名计算的区域和桶实际区域不匹配,直接触发权限拒绝。
修改S3客户端初始化配置,同时补个路径风格访问的配置避免寻址错误:
client: new S3Client({ apiVersion: '2006-03-01', // 用接口返回的实际区域,不要硬编码 region: uploadLocation.region, endpoint: uploadLocation.endpoint, credentials: S3ClientCred, // 强制路径风格访问,适配Cesium提供的上传端点 forcePathStyle: true })
其他需要核对的点
- 删掉你手动加的
signatureVersion: 'v4'配置,AWS SDK v3默认就用v4签名,手动指定在部分版本下会引发配置覆盖问题。 - 确认创建资产接口传入的资产类型正确:LAS点云文件对应的源资产类型为
POINT_CLOUD,类型传错返回的凭证权限会不匹配。 - 确认拿到
uploadLocation后15分钟内完成上传,临时凭证默认有效期只有15分钟,超时会失效。 - 确认
uploadLocation.endpoint是带https://前缀的完整地址,漏了协议头会导致SDK端点解析错误,签名计算失败。
修正后重新测试即可正常上传,不需要额外配置其他参数。
内容的提问来源于stack exchange,提问作者Rom
相关产品推荐
相关产品推荐

