#node.js #header #amazon-s3
#node.js #заголовок #amazon-s3
Вопрос:
Я пытаюсь принудительно загрузить файлы с Amazon S3, используя параметр запроса GET response-content-disposition
.
Сначала я создал подписанный URL, который отлично работает, когда я хочу просмотреть файл.
Затем я пытаюсь перенаправить туда с помощью response-content-disposition
заголовка. Вот мой код:
res.writeHead(302, {
'response-content-disposition': 'attachment',
'Location': 'http://s3-eu-west-1.amazonaws.com/mybucket/test/myfile.txt?Expires=1501018110amp;AWSAccessKeyId=XXXXXXamp;Signature=XXXXX',
});
Однако это просто перенаправляет на файл, а не загружает его.
Также, когда я пытаюсь зайти в файл с response-content-disposition
переменной как GET:
http://s3-eu-west-1.amazonaws.com/mybucket/test/myfile.txt?Expires=1501018110amp;AWSAccessKeyId=XXXXXXamp;Signature=XXXXXamp;response-content-disposition=attachment
.. Я получаю следующий ответ:
The request signature we calculated does not match the signature you provided. Check your key and signing method.
Ответ №1:
Привет, вы можете принудительно загрузить файл или изменить имя файла, используя приведенный ниже пример кода. Этот пример кода предназначен для загрузки файла с использованием preSignedUrl.
Важным моментом здесь является ключ ResponseContentDisposition в параметрах метода getSignedUrl. Нет необходимости передавать какой-либо заголовок в вашем запросе, например content-disposition..
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);
}
});
};
Ответ №2:
Правильный способ использования response-content-disposition
опции — включить ее в качестве переменной GET, но вы неправильно вычисляете подпись.
Дополнительную информацию о том, как следует вычислять подпись, можно найти в руководстве по аутентификации Amazon REST