Читать файл из aws s3 bucket с помощью node fs
Я пытаюсь прочитать файл, который находится в ведре aws s3, используя
fs.readFile(file, function (err, contents) {
var myLines = contents.Body.toString().split('\n')
})
Мне удалось загрузить и загрузить файл с помощью node aws-sdk, но я не понимаю, как просто его прочитать и проанализировать содержимое.
Вот пример того, как я читаю файл из s3:
var s3 = new AWS.S3();
var params = {Bucket: 'myBucket', Key: 'myKey.csv'}
var s3file = s3.getObject(params)
Ответы
Ответ 1
У вас есть пара вариантов. Вы можете включить обратный вызов в качестве второго аргумента, который будет вызываться с любым сообщением об ошибке и объектом. Этот пример прямо из документации AWS:
s3.getObject(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
В качестве альтернативы вы можете преобразовать вывод в поток. Там также example в документации AWS:
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);
Ответ 2
Это будет сделано:
new AWS.S3().getObject({ Bucket: this.awsBucketName, Key: keyName }, function(err, data)
{
if (!err)
console.log(data.Body.toString());
});
Ответ 3
Поскольку вы, похоже, хотите по очереди обрабатывать текстовый файл S3. Вот версия Node, которая использует стандартный модуль readline и AWS createReadStream()
const readline = require('readline');
const rl = readline.createInterface({
input: s3.getObject(params).createReadStream()
});
rl.on('line', function(line) {
console.log(line);
})
.on('close', function() {
});
Ответ 4
Я не мог понять, почему пока, но подход createReadStream
/pipe
не работал у меня. Я пытался загрузить большой файл CSV (300 Мбайт +), и я получил дублированные строки. Это казалось случайным вопросом. Окончательный размер файла варьировался в каждой попытке загрузить его.
В итоге я использовал другой способ, основанный на Примеры AWS JS SDK:
var s3 = new AWS.S3();
var params = {Bucket: 'myBucket', Key: 'myImageFile.jpg'};
var file = require('fs').createWriteStream('/path/to/file.jpg');
s3.getObject(params).
on('httpData', function(chunk) { file.write(chunk); }).
on('httpDone', function() { file.end(); }).
send();
Таким образом, он работал как шарм.
Ответ 5
вот пример, который я использовал для извлечения и анализа json-данных из s3.
var params = {Bucket: BUCKET_NAME, Key: KEY_NAME};
new AWS.S3().getObject(params, function(err, json_data)
{
if (!err) {
var json = JSON.parse(new Buffer(json_data.Body).toString("utf8"));
// PROCESS JSON DATA
......
}
});
Ответ 6
У меня была точно такая же проблема при загрузке из S3 очень больших файлов.
Пример решения из документов AWS просто не работает:
var file = fs.createWriteStream(options.filePath);
file.on('close', function(){
if(self.logger) self.logger.info("S3Dataset file download saved to %s", options.filePath );
return callback(null,done);
});
s3.getObject({ Key: documentKey }).createReadStream().on('error', function(err) {
if(self.logger) self.logger.error("S3Dataset download error key:%s error:%@", options.fileName, error);
return callback(error);
}).pipe(file);
Пока это решение будет работать:
var file = fs.createWriteStream(options.filePath);
s3.getObject({ Bucket: this._options.s3.Bucket, Key: documentKey })
.on('error', function(err) {
if(self.logger) self.logger.error("S3Dataset download error key:%s error:%@", options.fileName, error);
return callback(error);
})
.on('httpData', function(chunk) { file.write(chunk); })
.on('httpDone', function() {
file.end();
if(self.logger) self.logger.info("S3Dataset file download saved to %s", options.filePath );
return callback(null,done);
})
.send();
По какой-то причине попытка createReadStream
просто не срабатывает обратный вызов end
, close
или error
. См. здесь об этом.
Я использую это решение также для записи архивов в gzip, поскольку первый (пример AWS) не работает в этом случае:
var gunzip = zlib.createGunzip();
var file = fs.createWriteStream( options.filePath );
s3.getObject({ Bucket: this._options.s3.Bucket, Key: documentKey })
.on('error', function (error) {
if(self.logger) self.logger.error("%@",error);
return callback(error);
})
.on('httpData', function (chunk) {
file.write(chunk);
})
.on('httpDone', function () {
file.end();
if(self.logger) self.logger.info("downloadArchive downloaded %s", options.filePath);
fs.createReadStream( options.filePath )
.on('error', (error) => {
return callback(error);
})
.on('end', () => {
if(self.logger) self.logger.info("downloadArchive unarchived %s", options.fileDest);
return callback(null, options.fileDest);
})
.pipe(gunzip)
.pipe(fs.createWriteStream(options.fileDest))
})
.send();