AWS S3 通过预签名 URL 上传返回 400 错误请求

Posted

技术标签:

【中文标题】AWS S3 通过预签名 URL 上传返回 400 错误请求【英文标题】:AWS S3 upload via presigned url returns 400 bad request 【发布时间】:2019-10-31 06:11:51 【问题描述】:

我正在尝试通过向预签名 URL 发出 PUT 请求 来将文件上传到 AWS s3。我已经在 s3 仪表板上配置了 CORS。

反应代码

  const submit = async () => 
    const response = await axios.get("http://localhost:8080/api/upload");
    console.log(response.data);
    const upload = await axios.put(response.data.url, file, 
      headers: 
        "Access-Control-Allow-Origin": "*",
        "Content-Type": file.type
      
    );
  ;

Node.js 代码

const s3 = new AWS.S3(
  accessKeyId: config.aws.accessKeyId,
  secretAccessKey: config.aws.secretAccessKey
);
app.get("/api/upload", (req, res) => 
  const key = `$uuid().jpeg`;
  s3.getSignedUrl(
    "putObject",
    
      Bucket: "bucket-name",
      ContentType: "image/jpeg",
      Key: key
    ,
    (err, url) => 
      res.status(200).json( key, url );
    
  );
);

当我尝试向预签名 URL 发出 PUT 请求时,我收到下一个错误:

放 https://bucket-name.s3.amazonaws.com/dd7eb480-9115-11e9-bb14-75395bf4d226?AWSAccessKeyId=AKIAZPROFMOUP5TZZOIM&Content-Type=%2A&Expires=1560786770&Signature=c2ap3CcLKj%2FUD8yHtiHTNTnWJT4%3D 400 (Bad Request) createError.js:17 Uncaught (in promise) 错误: 请求失败,状态码 400 在 createError (createError.js:17) 定居时 (settle.js:19) 在 XMLHttpRequest.handleLoad (xhr.js:60)

【问题讨论】:

400 Bad Request 有几个原因。您需要捕获随附的响应正文以获得解释。 你解决过这个问题吗?我有同样的问题 正如@Michael-sqlbot 指出的那样,查看响应正文就可以了。我收到“AuthorizationQueryParametersError”。 对我来说也有同样的错误,它由this answer解决了 【参考方案1】:

创建s3实例的方法用你的bucket所在的region替换region:

AWS.config.update(region: 'REGION');

const s3 = new AWS.S3(
  apiVersion: '2006-03-01',
  accessKeyId: keys.accessKeyId,
  secretAccessKey: keys.secretAccessKey
);

【讨论】:

以上是关于AWS S3 通过预签名 URL 上传返回 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章

仅从浏览器使用预签名 URL 上传时出现 AWS S3 CORS 错误

通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问

通过使用 AWS-SDK PHP 生成的预签名帖子拒绝 AWS S3 上传访问

AWS 预签名 URL

AWS S3 PHP SDK 预签名 url 限制内容类型

AWS S3 PHP SDK 预签名 url 限制内容类型