2014-09-12 2 views
10

API-интерфейс node.js для S3 дает следующее описание для данных, возвращаемых в обратном вызове getObject. От http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property:Как определить тип данных в S3.getObject()

Корпус - (буфер, типизированный массив, блок-схема, строка, считываемый поток) Данные объекта.

Это действительно так? Нет ли способа контролировать, что из этого происходит?

ответ

12

Не знаю, можете ли вы заранее управлять типом поля данных.Body, указанным в обратном вызове getObject(). Если все, что вы хотите сделать, это определить, получили ли вы буфер, вы можете попробовать метод класса Node's Buffer.isBuffer (data.Body).

В качестве альтернативы, вы можете захотеть, чтобы избежать проблемы в целом и использовать этот подход от S3 documentation Амазонки:

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); 

Предполагая, что вы будете использовать этот код в типичной среде обратного вызова Node.js асинхронным, это может сделать больше смысла, чтобы увидеть код так:

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

Если приведенный выше код не загружается, как вы замаскируете ошибку? – Mike

+1

@Mike: до или после обработчика «закрыть» добавьте что-то вроде: file.on ('error', function (err) {callback (err);}); – Bruce

+0

Спасибо! Благодаря! Благодаря! – Mike

3

Я не мог найти способ, чтобы изменить тип кузова либо, однако после того, как заметил, что тело буфер, я преобразовал буфер в ReadableStream с удобным & Симпатичная прямо function: AWS.util.buffer.toStream (или, возможно, вы захотите использовать другую библиотеку, например streamifier).

Я искал что-то, где я мог бы проверять ошибки, прежде чем делать что-либо еще, на примере Амазонки он переводит «создать поток записи только в случае отсутствия ошибок».

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); 
    }); 
}); 
Смежные вопросы