2014-09-12 16 views

Antwort

12

Ich weiß nicht, ob Sie im Voraus den Typ der Daten steuern können. Body-Feld in der GetObject() -Rückruf bereitgestellt. Wenn Sie nur ermitteln möchten, ob Sie einen Puffer erhalten haben, können Sie die Klassenmethode Node's Buffer.isBuffer (data.Body) ausprobieren.

Alternativ könnten Sie das Problem zusammen und verwenden diesen Ansatz von Amazon S3 documentation vermeiden wollen:

var s3 = new AWS.S3(); 
var params = {Bucket: 'myBucket', Key: 'myImageFile.jpg'}; 
var file = require('fs').createWriteStream('/path/to/file.jpg'); 
s3.getObject(params).createReadStream().pipe(file); 

Vorausgesetzt, Sie werden mit diesem Code in einer typischen node.js Asynchron-Rückruf-Umgebung, könnte es machen mehr Sinn der Code wie so zu sehen:

var fs = require('fs'); 

function downloadFile(key, localPath, callback) { 
    var s3 = new AWS.S3(); 
    var params = {Bucket: 'myBucket', Key: key}; 
    var file = fs.createWriteStream(localPath); 

    file.on('close') { 
    callback(); 
    } 

    file.on('error', function(err) { 
    callback(err); 
    }); 

    s3.getObject(params).createReadStream().pipe(file); 
} 
+1

Wenn der obige Code nicht heruntergeladen werden kann, wie fangen Sie den Fehler? – Mike

+1

@Mike: Fügen Sie vor oder nach dem 'close' -Handler etwas hinzu: file.on (' error ', function (err) {callback (err);}); – Bruce

+0

Danke! Vielen Dank! Vielen Dank! – Mike

3

ich keine Möglichkeit, den Körperbau finden konnten entweder zu ändern, aber nachdem der Körper bemerken einen Puffer war, verwandelte ich den Puffer in einem ReadableStream mit diesem praktischen & ziemlich einfach function: AWS.util.buffer.toStream (oder vielleicht möchten Sie eine andere Bibliothek wie streamifier verwenden).

Ich war auf der Suche nach etwas, wo ich Fehler überprüfen könnte, bevor Sie etwas anderes tun, in Amazon Beispiel heißt es "Erstellen Sie den Write Stream nur, wenn es keine Fehler gab".

s3.getObject(params, function(err, data) { 
    if (err) { 
     console.log(err); 
     return; 
    } 

    var file = require('fs').createWriteStream(name); 
    var read = AWS.util.buffer.toStream(data.Body); 

    read.pipe(file); 
    read.on('data', function(chunk) { 
     console.log('got %d bytes of data', chunk.length); 
    }); 
}); 
Verwandte Themen