将aws-sdk.js与NodeJs一起使用。
生成了用于将文件上传(putObject)到AWS存储桶的签名URL,以及文件下载(getObject)签名URL。
文件下载URL正常,但是上传URL抛出错误:
<?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>AWSACCESSKEY</AWSAccessKeyId></Error>
JS为getObject
和putObject
生成签名URL:
var AWS = require('aws-sdk');
// AWS is configured in .aws and is correct
const s3 = new AWS.S3();
var params = {
Bucket: 'upload-bucket',
Key: 'Account_Info.pdf',
Expires: 60*60
};
// Upload signedUrl
let putUrl = s3.getSignedUrl('putObject', params);
console.log("Put: ", putUrl);
let p = JSON.parse(JSON.stringify(params));
p.Key= 'Account.pdf';
// download signed Url
let url = s3.getSignedUrl('getObject', p);
用于下载的签名URL可以正常工作,需要知道put API可能出了什么问题。
用于上传文件的JS代码:
let request = require('request');
var fs = require("fs");
let file = new Buffer(fs.readFileSync('Account_Info.pdf', 'base64'), 'base64');
let url = putUrl; //'something/Account_Info.pdf';
let method = 'PUT';
let qs = {
'AWSAccessKeyId': 'AWSACCESSKEY',
'Expires':'1539258230',
'Signature':'Qbuu9fP6rrmwWDAPQFf%2BE3JiGZo%3D'
};
let formData = {
file: { value: file,
options: { filename: 'Account_Info.pdf', contentType: 'pdf' } }
};
let ops = {
url, method, qs, formData
};
request (ops, (err, res, body) => {
console.log(err);
console.log(body);
});
由于所有特殊字符都转换为utf-8表示法(例如所有 = 变为%2D , / 变为%2F , + 变为%2B 。但是尝试将它们转换回实际格式是行不通的,更多的操作似乎并不影响GET URL。尝试沿URL传递qs,结果不变。
浪费了3天的时间弄清楚这里可能出了什么问题。希望AWS错误会更清楚,并且AWS会为文件上传提供更好的文档。
需要任何帮助。