Подтвердить что ты не робот

Загрузите двоичный файл на S3 с помощью AWS SDK для Node.js

Обновление: В будущем, Amazon теперь обновила документацию из того, что было там в момент запроса. Согласно комментарию @Loren Segal ниже: -

Мы скорректировали документы в последней версии предварительного просмотра, чтобы правильно документировать этот параметр. Извините за смешение!


Я тестирую предварительный просмотр AWS SDK для Node.Js и хочу загрузить заархивированный tarball на S3, используя putObject.

Согласно документации, параметр Body должен быть...

Тело - (кодированные данные Base64)

... поэтому, я пробую следующий код...

var AWS = require('aws-sdk'),
    fs = require('fs');

// For dev purposes only
AWS.config.update({ accessKeyId: 'key', secretAccessKey: 'secret' });

// Read in the file, convert it to base64, store to S3
fs.readFile('myarchive.tgz', function (err, data) {
  if (err) { throw err; }

  var base64data = new Buffer(data, 'binary').toString('base64');

  var s3 = new AWS.S3();
  s3.client.putObject({
    Bucket: 'mybucketname',
    Key: 'myarchive.tgz',
    Body: base64data
  }).done(function (resp) {
    console.log('Successfully uploaded package.');
  });

});

Пока я могу видеть файл на S3, если я его загружаю и пытаюсь распаковать, я получаю сообщение об ошибке, что файл поврежден. Поэтому кажется, что мой метод для "кодированных данных base64" отключен.

Может кто-нибудь, пожалуйста, помогите мне загрузить двоичный файл с помощью putObject?

4b9b3361

Ответ 1

Вам не нужно преобразовывать буфер в строку base64. Просто установите тело на данные, и он будет работать.

Ответ 2

Вот способ отправки файла с использованием потоков, которые могут потребоваться для больших файлов, и, как правило, уменьшают издержки памяти:

var AWS = require('aws-sdk'),
    fs = require('fs');

// For dev purposes only
AWS.config.update({ accessKeyId: 'key', secretAccessKey: 'secret' });

// Read in the file, convert it to base64, store to S3
var fileStream = fs.createReadStream('myarchive.tgz');
fileStream.on('error', function (err) {
  if (err) { throw err; }
});  
fileStream.on('open', function () {
  var s3 = new AWS.S3();
  s3.putObject({
    Bucket: 'mybucketname',
    Key: 'myarchive.tgz',
    Body: fileStream
  }, function (err) {
    if (err) { throw err; }
  });
});

Ответ 3

Я смог загрузить мой двоичный файл таким образом.

var fileStream = fs.createReadStream("F:/directory/fileName.ext");
var putParams = {
    Bucket: s3bucket,
    Key: s3key,
    Body: fileStream
};
s3.putObject(putParams, function(putErr, putData){
    if(putErr){
        console.error(putErr);
    } else {
        console.log(putData);
    }
});