我正在开发数据管理应用程序,客户可以在zip file(approx 250 MB)
上上传多个text files(approx 1500 MB)
AWS S3
。
但是由于aws lamda
(最大1536MB大小)的内存有限,我能够提取(50 MB)的zip文件,并提取(500 MB)文件。
由于我需要在提取时对提取的文件添加一些验证,之后我必须将所有文件内容存储到数据库中。
目前我正在aws-lambda tmp location
存储文件内容,其中也有最大500MB可以使用的限制。
任何有助于我通过验证执行上述任务的流式传输概念对我都有帮助。
我可以使用EC2, ECS
,但现在我只想使用AWS-Lambda
。
使用此代码,我将解压缩并将zip文件上传到另一个S3
存储桶。
像流式传输这样的任何其他概念都会对我有所帮助,因为我对流媒体概念不太熟悉,我在这里提出一些想法来解决我的问题。
s3.getObject(params, (err, data) => {
if (err) {
console.log('Error', err);
var message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
console.log(message);
// callback(message);
} else {
console.log('Started to buffer data');
JSZip.loadAsync(data.Body).then(function(zip) {
fs.writeFile('temp/hello.txt', 'New file added for testing');
async.each(zip.files, function(item, cb1) {
if (!item.dir && item.name.includes('nightly')) {
zip.file(item.name).async("text").then(function(content) {
fs.writeFile('temp/' + item.name.replace(/^.*[\\\/]/, ''), content, function(err) {
if (err) throw err;
cb1();
});
});
} else {
cb1();
}
}, function(err, result) {
var zipObj = new JSZip();
fs.readdir('./temp', function(err, files) {
console.log(files);
async.each(files, function(file, cb2) {
fs.readFile('./temp/' + file, 'utf-8', function(err, content) {
if (err) {
return err;
}
zipObj.file(file, content);
cb2();
});
}, function(err) {
zipObj.generateAsync({
type: "nodebuffer"
})
.then(function(content) {
console.log(content);
deleteFiles(['./temp/*'], function(err, paths) {
console.log('Deleted files/folders:\n', paths.join('\n'));
});
s3.putObject({
Bucket: 'abtempb',
Key: 'temp/records.zip',
Body: content
}, function(err, result) {
if (result && result.ETag) {
console.log('uploaded file: ', result.ETag);
}
console.log('Error ', err);
});
});
});
});
});
});
}
});
谢谢