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

上传文件到DigitalOcean Spaces设置public-read ACL遇签名匹配错误

解决DigitalOcean Spaces上传时添加x-amz-acl: public-read导致的SignatureDoesNotMatch错误

出现这个错误的核心原因是:你用的是预签名上传URL,这类URL的签名是后端生成时基于特定请求参数计算出来的。如果你在前端上传时额外添加了生成URL时没包含的请求头(比如x-amz-acl),签名验证就会失败——因为实际请求和生成签名时的参数不匹配。

解决步骤:

  • 后端生成预签名URL时必须包含x-amz-acl相关参数
    因为DigitalOcean Spaces兼容S3 API,后端生成预签名PUT URL的时候,需要把ACL: 'public-read'作为请求参数的一部分传入,这样生成的签名会包含这个权限配置的信息。

    举个Node.js后端用AWS SDK生成URL的示例:

    const AWS = require('aws-sdk');
    const spacesEndpoint = new AWS.Endpoint('your-region.digitaloceanspaces.com');
    const s3 = new AWS.S3({
      endpoint: spacesEndpoint,
      accessKeyId: 'YOUR_ACCESS_KEY',
      secretAccessKey: 'YOUR_SECRET_KEY'
    });
    
    const generateUploadUrl = async (fileName) => {
      const params = {
        Bucket: 'your-bucket-name',
        Key: fileName,
        Expires: 3600,
        ACL: 'public-read', // 必须加上这个参数
        ContentType: 'image/png' // 和前端上传的ContentType保持一致
      };
      return s3.getSignedUrlPromise('putObject', params);
    };
    
  • 前端保持现有代码即可
    只要后端生成URL时已经包含了ACL参数,前端上传时携带x-amz-acl: public-read头就不会触发签名错误,同时文件会被自动设置为公开可读。

额外注意点:

  • 前端设置的Content-Type要和后端生成URL时指定的完全一致,否则也可能引发签名不匹配问题。
  • 检查你的DigitalOcean Spaces密钥是否具备PutObjectAcl权限,没有的话需要调整密钥权限配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 11:15:35