使用NodeJS下载S3强制文件

时间:2011-11-11 15:47:59

标签: node.js header amazon-s3

我正在尝试使用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.

2 个答案:

答案 0 :(得分:0)

使用response-content-disposition选项的正确方法是将其包含为GET变量,但您并未正确计算签名。

您可以在Amazon REST Authentication guide

中找到有关如何计算签名的更多信息

答案 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);
        }
    });
};