使用密码压缩两次,并使用Node.js、Lambda&;SES
我正在尝试使用archiver zip encrypted node.js模块对文件进行两次压缩。当我尝试本地机器时,该文件能够使用加密AES256中的密码压缩两次。但是,当我在Lambda中尝试相同的方法时,它在本地的行为并不相同。我尝试附加这两个文件,我注意到第一个zip文件里面有实际的文件,但我在创建第二个zip文件时遇到了问题,因为它里面有一个空白文件使用密码压缩两次,并使用Node.js、Lambda&;SES,node.js,aws-lambda,amazon-ses,Node.js,Aws Lambda,Amazon Ses,我正在尝试使用archiver zip encrypted node.js模块对文件进行两次压缩。当我尝试本地机器时,该文件能够使用加密AES256中的密码压缩两次。但是,当我在Lambda中尝试相同的方法时,它在本地的行为并不相同。我尝试附加这两个文件,我注意到第一个zip文件里面有实际的文件,但我在创建第二个zip文件时遇到了问题,因为它里面有一个空白文件 var aws = require('aws-sdk'); var nodemailer = require('nodemailer')
var aws = require('aws-sdk');
var nodemailer = require('nodemailer');
var ses = new aws.SES();
const archiver = require('archiver');
const stream = require('stream')
var fs = require('fs');
var async = require('async');
exports.handler = function (event, context, callback) {
const filepath = event.filepath;
const filename = event.file;
const email = event.email;
const bucket = "BUCKETNAME";
const filepathZip = '/tmp/'+filename +'.zip';
const filenameZip = filename +'.zip';
var s3 = new aws.S3();
var options = {
Bucket:bucket,
Key: 'files/' + filename
};
var fileStream = s3.getObject(options).createReadStream();
archiver.registerFormat('zip-encrypted', require("archiver-zip-encrypted"));
var output = fs.createWriteStream(filepathZip);
var randampassword = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
let archive = archiver.create('zip-encrypted', {zlib: {level: 8}, encryptionMethod: 'aes256', password: randampassword });
output.on('close', function() {
console.log(archive.pointer() + ' total bytes ');
console.log('archiver has been finalized and the output file descriptor has closed.');
console.log(randampassword);
});
archive.on('err', function(err) {
throw err;
});
var FinalZip = '/tmp/'+filename +'_final.zip';
let archive_final = archiver.create('zip-encrypted', {zlib: {level: 8}, encryptionMethod: 'aes256', password: randampassword });
var output_final = fs.createWriteStream(FinalZip)
async.waterfall([
function(callback){
archive.pipe(output);
archive.append(fileStream, { name: filename }).finalize();
archive_final.pipe(output_final);
archive_final
.file(filepathZip, { name: filenameZip })
.finalize();
}
]);
getS3File('BUCKETNAME', 'test.txt')
.then(function (fileData) {
var mailOptions = {
from: 'SENDER',
subject: 'This is an email sent from a Lambda function!',
html: `<p>You got a contact message from: <b>${event.email}</b> paasword: <b>${randampassword}</b></p>`,
to: 'RECEIVER',
// bcc: Any BCC address you want here in an array,
attachments: [
{
filename: "attach.zip",
path: filepathZip
}
]
};
console.log('Creating SES transporter');
var transporter = nodemailer.createTransport({
SES: ses
});
transporter.sendMail(mailOptions, function (err, info) {
if (err) {
console.log(err);
console.log('Error sending email');
callback(err);
} else {
console.log('Email sent successfully');
callback();
}
});
})
.catch(function (error) {
console.log(error);
console.log('Error getting attachment from S3');
callback(error);
});
};
var aws=require('aws-sdk');
var nodeEmailer=require('nodeEmailer');
var ses=新的aws.ses();
const-archiver=require('archiver');
const stream=require('stream')
var fs=需要('fs');
var async=require('async');
exports.handler=函数(事件、上下文、回调){
const filepath=event.filepath;
const filename=event.file;
const email=event.email;
const bucket=“BUCKETNAME”;
const filepathZip='/tmp/'+filename+'.zip';
const filenameZip=filename+'.zip';
var s3=新的aws.s3();
变量选项={
桶:桶,
键:“files/”+文件名
};
var fileStream=s3.getObject(options).createReadStream();
registerFormat('zip-encrypted',require('archiver-zip-encrypted');
var output=fs.createWriteStream(filepathZip);
var randampassword=Math.random().toString(36).substring(2,15)+Math.random().toString(36).substring(2,15);
让archive=archiver.create('zip-encrypted',{zlib:{level:8},encryptionMethod:'aes256',密码:randampassword});
output.on('close',function(){
log(archive.pointer()+'总字节');
log('归档程序已完成,输出文件描述符已关闭');
console.log(randampassword);
});
存档.on('err',函数(err){
犯错误;
});
var FinalZip='/tmp/'+filename+''u final.zip';
让archive_final=archiver.create('zip-encrypted',{zlib:{level:8},encryptionMethod:'aes256',密码:randampassword});
var output_final=fs.createWriteStream(FinalZip)
异步瀑布([
函数(回调){
归档.管道(输出);
append(fileStream,{name:filename}).finalize();
归档最终管道(输出最终管道);
档案室期末考试
.file(filepathZip,{name:filenameZip})
.finalize();
}
]);
getS3File('BUCKETNAME','test.txt')
.then(函数(文件数据){
var mailpoptions={
发件人:,
主题:“这是Lambda函数发送的电子邮件!”,
html:`您收到了来自以下地址的联系信息:${event.email}paasword:${randampassword}`,
致:“接收者”,
//密件抄送:数组中所需的任何密件抄送地址,
附件:[
{
文件名:“attach.zip”,
路径:filepathZip
}
]
};
console.log('创建SES transporter');
var transporter=nodeEmailer.createTransport({
SES:SES
});
transporter.sendMail(邮件选项,函数(错误,信息){
如果(错误){
控制台日志(err);
console.log(“发送电子邮件时出错”);
回调(err);
}否则{
console.log(“电子邮件发送成功”);
回调();
}
});
})
.catch(函数(错误){
console.log(错误);
log('从S3获取附件时出错');
回调(错误);
});
};
您不必执行存档\u final.append
我使用了存档\u final.file(filepathZip,{name:filenameZip}).finalize()
要压缩第二个archiveDo,您必须使用瀑布