Что я хочу сделать, так это прочитать файл с S3 - обновить некоторую информацию - загрузить его обратно, используя потоки, без необходимости создавать копию файла на сервере.Я использовал библиотеку событий-потоков для анализа файла следующим образом: (Обновлено с решением!)
let params = {
Bucket: Bucket,
Key: Key,
};
let rStream = s3.getObject(params).createReadStream();
let updatedFile = fs.createWriteStream('/tmp/updated-' + Key);
return new Promise((resolve, reject) => {
let s = rStream
.pipe(es.split())
.pipe(es.mapSync(function(data) {
if(!data) return;
s.pause();
let line = data.split(',');
if(line[1]==='xyz'){
line[1] = 'xyz11';
}
updatedFile.write(line.join(','));
updatedFile.write('\n');
s.resume();
})
.on('error', function(err) {
reject(err);
})
.on('end', function() {
updatedFile.end();
//createReadStream from path of updatedFile
//s3 upload file logic
//delete tmp file logic
resolve(true);
}));
});
Моя проблема в том, что когда я возвращаю этот поток обратно, он закрывается и имеет читабельный: ложь, поэтому яне могу его использовать:
const updatedStream = fs.createReadStream(tmpfilePath);
params={
Bucket: Bucket,
Key: Key,
Body: updatedStream
};
await s3.upload(params)
.on('httpUploadProgress', (progress) => {
console.log('progress', progress)
})
.send();
try {
fs.unlink(tmpfilePath, function (err) {
if (err) throw err;
console.log("Tmp File deleted successfully.");
});
} catch(err) {
console.log("Warning: Unable to delete the tmp file.", err);
}
Есть мысли?Поток событий закрывает поток, и поэтому его можно прочитать: false, когда я передаю его обратно.
Как создать поток чтения, изменить данные и сделать поток читаемым, чтобы передать его в функцию s3.upload?
РЕШЕНИЕ
В конце концов мне удалось заставить это работать.
Я создал временный файл writeStream, в который я пишу после каждой итерации.Когда поток заканчивается, я закрываю writeStream, чтобы закрыть свой временный файл.
Затем я загружаю его обратно в S3 (создавая readStream из моего временного файла).
После завершения загрузки я удаляю временный файл.