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

NodeJS+express上传文件到Amazon S3报SignatureDoesNotMatch错误求助

Amazon S3 SignatureDoesNotMatch 错误排查方案

常见原因及修复步骤

  • 环境变量格式错误:确认AWS_ACCESS_KEY、AWS_SECRET_KEY、AWS_BUCKET_REGION、AWS_BUCKET_NAME几个环境变量没有多余的前后空格、换行符,复制密钥时很容易附带多余空白字符直接导致签名校验失败。
  • 签名版本不匹配:AWS 部分新上线的区域仅支持V4版本签名,旧版aws-sdk默认可能使用V2签名导致校验失败,需要在S3初始化配置中强制指定V4签名。
  • 对象键包含特殊字符:如果上传的文件名file.name包含中文、空格、斜杠、emoji等非ASCII特殊字符,会直接影响签名计算结果,需要对对象键做编码处理。
  • 变量覆盖异常:当前控制器代码存在变量重名问题,路由回调的响应参数res和接收上传结果的变量重名,会导致不可预期的逻辑异常。
  • 存储桶额外配置不兼容:如果存储桶开启了KMS默认加密、对象锁等特殊配置,上传时未携带对应参数也会触发签名校验失败。
  • 权限策略优先级冲突:桶策略的优先级高于IAM用户策略,需要确认桶策略没有禁止对应IAM用户的s3:PutObject权限。

修复后的代码示例

S3配置及上传函数

import AWS from 'aws-sdk';

// 可选:开启debug日志,输出完整请求参数方便排查
// AWS.config.logger = console;

const s3 = new AWS.S3({
    region: process.env.AWS_BUCKET_REGION?.trim(),
    accessKeyId: process.env.AWS_ACCESS_KEY?.trim(),
    secretAccessKey: process.env.AWS_SECRET_KEY?.trim(),
    signatureVersion: 'v4' // 强制使用V4版本签名
}) 

export const uploadFileS3 = (file) => {
    // 处理对象键,兼容特殊字符
    const safeKey = encodeURIComponent(file.name.trim());
    const uploadParams = {
        Bucket: process.env.AWS_BUCKET_NAME?.trim(),
        Body: file.data,
        Key: safeKey
        // 如存储桶开启KMS加密,补充以下参数
        // ServerSideEncryption: 'aws:kms',
        // SSEKMSKeyId: '对应KMS密钥ID'
    };

    return s3.upload(uploadParams).promise()
}

Express控制器代码

routerProgress.post("/upload-progress", verifyJWT, async (req, res) => {
    try {
        const { file1 } = req.files;
        const uploadRes = await uploadFileS3(file1);
        console.log(uploadRes);
        return res.status(200).json({ success: true, data: uploadRes });
    } catch (err) {
        console.error('S3上传失败', err);
        return res.status(500).json({ success: false, message: err.message });
    }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:39:03