根据https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getSignedUrl-property的文档:
注意:
使用预签名 URL 时,并非所有操作参数都受支持。
某些参数,例如 SSECustomerKey、ACL、Expires、
发送内容时,必须将 ContentLength 或 Tagging 作为标头提供
要求。如果您使用预签名 URL 从浏览器上传,并且
需要使用这些字段,请参见 createPresignedPost()。
你需要这样的代码:
在后台:
AWS.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
region: process.env.AWS_REGION,
signatureVersion: 'v4' // NB! this seems needed to avoid some bugs
})
s3.getSignedUrl('getObject', {
Bucket: process.env.S3_BUCKET_NAME,
Key: key,
SSECustomerAlgorithm: 'AES256', // NB! this must be added
})
在浏览器中:
//encryption key can be generated in nodejs:
//var password = "some easy to remember password";
//var encryption_key = crypto.createHash('sha256').update(password, 'utf8').digest('base64');
//var encryption_key_md5 = crypto.createHash('md5').update(encryption_key, 'base64').digest('base64');
function presigned_get(url) {
console.log("presigned_get", url);
var xhr = new XMLHttpRequest();
xhr.responseType = 'blob';
xhr.open("get", url);
xhr.setRequestHeader("x-amz-server-side-encryption-customer-algorithm", "AES256");
xhr.setRequestHeader("x-amz-server-side-encryption-customer-key", ENCRYPTION_KEY);
//xhr.setRequestHeader("x-amz-server-side-encryption-customer-key-MD5", ENCRYPTION_KEY_MD5);
xhr.send();
xhr.onload = function() {
if (xhr.status == 200) {
console.log(`Downloaded ${url}`);
var filename = url.substring(0, url.indexOf('?'));
filename = filename.substring(filename.lastIndexOf('/')+1);
window.saveAs(xhr.response, filename);
} else {
var reader = new FileReader();
reader.readAsText(xhr.response);
reader.addEventListener('loadend', (e) => {
console.error(`Downloading ${url} failed:`, xhr.statusText, e.srcElement.result);
});
}
}
}