如何使用Node.js和Axios将文件上传到AWS中的预签名URL?

我有下一个场景:

  1. 生成签名的URL以供AWS-SDK上传文件
  2. 尝试使用Axios(或请求)npm包上传本地文件

但是每次我有一个错误:

状态:403状态文本:禁止

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>FakeKeyId</AWSAccessKeyId><StringToSign>PUT

application/json;charset=utf-8
1577742550
/test-bucket-super/xxx/test.mp3</StringToSign><SignatureProvided>DAAOZ0/VkMNEMMlGkRUsSuRO3J4=</SignatureProvided><StringToSignBytes>50 55 54 0a 0a 61 70 70 6c 69 63 61 74 69 6f 6e 2f 6a 73 6f 6e 3b 63 68 61 72 73 65 74 3d 75 74 66 2d 38 0a 31 35 37 37 37 34 32 35 35 30 0a 2f 74 65 73 74 2d 62 75 63 6b 65 74 2d 73 75 70 65 72 2f 78 78 78 2f 74 65 73 74 2e 6d 70 33</StringToSignBytes><RequestId>CBD3F1D0D02EA874</RequestId><HostId>LPu+RQ8otcljI1Wt5FiZm+UmTFNiCX+2HyGtN0kTAugLiT21M55DtbzQdF/s7qOCSaZvzTp4kw4=</HostId></Error>
const axios = require('axios');
const AWS = require('aws-sdk')

const s3 = new AWS.S3({
    accessKeyId: 'FakeKeyId',
    secretAccessKey: 'xxxxxxxxxxxxxxxxxxxxxxxx',
    region: 'eu-west-1'
});

const fs = require('fs');
const readFile = require('util').promisify(fs.readFile);

(async () => {
    try {
        const presignedS3Url = s3.getSignedUrl('putObject', {
            Bucket: 'test-bucket-super',
            Key: 'xxx/test.mp3'
        });
        const file = await readFile('./SampleAudio_0.4mb.mp3');

        const axiosResponse = await axios.put(presignedS3Url, {
            data: file,
        });
        console.info(axiosResponse)
    } catch (e) {
        console.error(e)
    }
})();

但是我设法通过cURL上传文件

curl -X PUT -T ~/Downloads/SampleAudio_0.4mb.mp3 'https://test-bucket-super.s3.eu-west-1.amazonaws.com/xxx/test.mp3?AWSAccessKeyId=FakeKeyId&Expires=1577741900&Signature=9kPiC%2B85SEFp6g5C3nwEWe4TueU%3D' -v
阿伦·K

这里的问题是,axios由于某种原因添加了默认Content-Type: application/json标头。这就是签名不匹配的原因。我不确定如何删除标题。

但是下面的工作对我来说是我content-type在签名生成期间所需要的。另外,在使用它时,我会包含相同的标头。

(async () => {
  try {
    const presignedS3Url = s3.getSignedUrl('putObject', {
      Bucket: 'bucket-name',
      Key: 'car.jpg',
      ContentType: 'application/octet-stream'
    });
    const file = await readFile('./car.jpg');

    const axiosResponse = await axios.put(presignedS3Url, {
      data: file,

    }, {
      headers: {
        'Content-Type': 'application/octet-stream'
      }
    });
    console.info(axiosResponse)
  } catch (e) {
    console.error(e)
  }
})();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将文件上传到AWS中的预签名URL?

使用Retrofit2将文件上传到AWS S3预签名URL

如何将文件上传到 Laravel 中的 Amazon S3 预签名 URL?

使用生成的预签名 url 将文件上传到 minio 的请求中缺少字段

如何使用angular或javascript中的预签名URL将文件上传到S3存储桶

生成预签名的url,以便使用python将文件上传到Google存储空间

使用预签名 URL 将文件上传到 s3

无论我做什么,都无法使用预签名URL将文件上传到S3。AWS命令行有效。CURL和其他= 403

Ionic android-使用预签名的URL将文件上传到S3(错误代码:3)

如何使用 Node.js 从 AWS Lambda 中的 /tmp 文件夹将 WAV 文件上传到 S3

Node.js-使用Brightcove生成的带有签名URL的文件上传到AWS W3返回403禁止

使用 PHP cURL 将文件上传到 Google 签名 URL

如何在Ruby中将预签名的POST文件上传到AWS S3?

如何使用Node.js将内存中的文件数据上传到Google云存储?

使用预签名 URL 流式上传到 S3

使用预签名 URL 上传后,AWS S3 上的文件在文件中包含额外信息

如何在React.js中同时将图像上传到Firebase存储和同时将URL上传到Firestore?

无法使用文件上传将图像上传到node.js中的特定文件夹

如何使用axios将图像/文件从Vue js上传到Laravel7

如何使用axios将文件上传到Dropbox

将 JSON 文件从 node.js 中的 aws-sdk 上传到 aws s3 存储桶

如何将Node.js和NPM可执行文件上传到工件

如何使用客户端库从Node JS将文件夹上传到GCS

使用ajax通过签名的url将文件上传到谷歌云存储

使用Python将文件上传到Google Cloud Storage签名的URL

使用签名的URL将图像文件上传到Google Cloud时出现CORS错误

使用Node.js和Busboy将多个文件上传到S3

使用Node.js将文件上传到Firebase存储

使用Node.js将文件上传到Netsuite