web-dev-qa-db-fra.com

Téléchargez un fichier binaire sur S3 à l'aide d'AWS SDK for Node.js

Mise à jour: Pour référence future, Amazon a maintenant mis à jour la documentation à partir de ce qui existait au moment de la demande. Selon le commentaire de @Loren Segal ci-dessous: -

Nous avons corrigé les documents dans la dernière version d'aperçu pour documenter correctement ce paramètre. Désolé pour le mélange!


J'essaie l'aperçu du développeur de le kit SDK AWS pour Node.Js et je veux télécharger une archive tar compressée vers S3 en utilisant putObject.

Selon la documentation , le paramètre Body devrait être ...

Corps - (Données codées Base64)

... par conséquent, j'essaie le code suivant ...

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.');
  });

});

Bien que je puisse alors voir le fichier dans S3, si je le télécharge et tente de le décompresser, j'obtiens une erreur indiquant que le fichier est corrompu. Il semble donc que ma méthode pour les "données encodées en base64" soit désactivée.

Quelqu'un peut-il m'aider à télécharger un fichier binaire en utilisant putObject?

48
isNaN1247

Vous n'avez pas besoin de convertir le tampon en une chaîne base64. Réglez simplement le corps sur les données et cela fonctionnera.

42
AndyD

Voici un moyen d'envoyer un fichier à l'aide de flux, ce qui peut être nécessaire pour les fichiers volumineux et réduira généralement la surcharge de mémoire:

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; }
  });
});
24
CaptEmulation

J'ai pu télécharger mon fichier binaire de cette façon.

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);
    }
});
9
shaun