我正在尝试使用GET请求参数response-content-disposition
强制从Amazon S3下载文件。
我首先创建了一个签名网址,当我想查看该文件时,该网址正常工作。
然后我尝试使用response-content-disposition
标头重定向到那里。这是我的代码:
res.writeHead(302, {
'response-content-disposition': 'attachment',
'Location': 'http://s3-eu-west-1.amazonaws.com/mybucket/test/myfile.txt?Expires=1501018110&AWSAccessKeyId=XXXXXX&Signature=XXXXX',
});
但是,这只是重定向到文件而不下载。
当我尝试使用response-content-disposition
作为GET变量的文件访问时:
http://s3-eu-west-1.amazonaws.com/mybucket/test/myfile.txt?Expires=1501018110&AWSAccessKeyId=XXXXXX&Signature=XXXXX&response-content-disposition=attachment
..我发现以下回应:
The request signature we calculated does not match the signature you provided. Check your key and signing method.
答案 0 :(得分:0)
使用response-content-disposition
选项的正确方法是将其包含为GET变量,但您并未正确计算签名。
答案 1 :(得分:0)
您可以强制下载文件,也可以使用下面的示例代码更改文件名。此示例代码是使用preSignedUrl下载文件。
这里重要的是getSignedUrl方法的params中的ResponseContentDisposition键。无需在您的请求中传递任何标题,例如内容处置..
var aws = require('aws-sdk');
var s3 = new aws.S3();
exports.handler = function (event, context) {
var params = {
Bucket: event.bucket,
Key: event.key,
ResponseContentDisposition :'attachment;filename=' + 'myprefix' + event.key
};
s3.getSignedUrl('getObject', params, function (err, url) {
if (err) {
console.log(JSON.stringify(err));
context.fail(err);
}
else {
context.succeed(url);
}
});
};