Принудительная загрузка файла S3 с помощью NodeJS

#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