Angularjs 将aws lambda动态生成的pdf上传至aws-s3
在我的Angularjs 将aws lambda动态生成的pdf上传至aws-s3,angularjs,node.js,amazon-s3,aws-lambda,serverless-framework,Angularjs,Node.js,Amazon S3,Aws Lambda,Serverless Framework,在我的serverless应用程序中,我想创建动态生成的pdf,然后将创建的pdf上传到aws s3。我的问题是,当url从服务器返回到客户端代码时,上传的url不起作用。我的代码如下: 客户端javascript代码(angular.js) 无服务器代码 var fs = require('fs'); var pdf = require('html-pdf'); var AWS = require("aws-sdk"); var s3 = new AWS.S3(); module.expo
serverless
应用程序中,我想创建动态生成的pdf,然后将创建的pdf上传到aws s3
。我的问题是,当url从服务器返回到客户端代码时,上传的url不起作用。我的代码如下:
客户端javascript代码(angular.js)
无服务器代码
var fs = require('fs');
var pdf = require('html-pdf');
var AWS = require("aws-sdk");
var s3 = new AWS.S3();
module.exports.handler = function(event, context) {
if (event.html) { // client html data
AWS.config.update({
accessKeyId: 'xxxxxxxxxxxxxxxxx',
secretAccessKey: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
region: 'xxxxxxxxxxxxxxxxxxxx'
});
var awsInfo = {
bucket: 'xxxxx-xxxxxx'
};
var baseUrl = 'https://s3-my-region.amazonaws.com/s3-upload-directory';
var folderRoot = 'development/pdf';
// unique file name
var output_filename = Math.random().toString(36).slice(2) + '.pdf';
// file created directory
var output = '/tmp/' + output_filename;
pdf.create(event.html, options).toStream(function(err, stream) {
if( err ) {
console.log('pdf err : ', err);
} else {
writeStream =fs.createWriteStream(output);
s3.putObject({
Bucket : awsInfo.bucket,
Key : folderRoot + '/' + output_filename,
Body : fs.createReadStream(output),
ContentType : "application/pdf"
},
function(error, data) {
if (error != null) {
console.log("error: " + error);
} else {
// upload data: { ETag: '"d41d8cd98f00b204e9800998ecf8427e"' }
console.log('upload data : ', data);
return cb(null, {
// return actual aws link, but no file
// ex: 'https://s3-my-region.amazonaws.com/s3-upload-directory/output_filename.pdf
url: baseUrl + '/' + output_filename
});
}
});
}
}
};
我以前也做过类似的事情
我希望您能澄清一些问题,然后我就能更好地帮助您。
1) 在代码(服务器端)中,您在回调函数中提到,实际的aws链接将被返回。 您确定您的文件已上载到AmazonS3吗。我的意思是,你是否检查过你的存储桶中的文件?
2) 您是否在AmazonS3上设置了自定义存储桶策略。Bucket策略在可以从S3下载的内容中起着重要作用。
3) 您是否检查了日志以确定是哪部分代码导致了错误?
请提供我这些信息,我想我应该能够帮助你 我已经解决了我的问题。我试图在生成pdf之前上传pdf。我已使用以下代码解决此问题:
pdf.create(event.html, options).toStream(function(err, stream) {
if (err) {
console.log('pdf err : ', err);
} else {
var stream = stream.pipe(fs.createWriteStream(output));
stream.on('finish', function () {
s3.putObject({
Bucket : awsInfo.bucket,
Key : folderRoot + '/' + output_filename,
Body : fs.createReadStream(output),
ContentType : "application/pdf"
},
function(error, data) {
if (error != null) {
console.log("error: " + error);
return cb(null, {
err: error
});
} else {
var url = baseUrl + '/' + output_filename
return cb(null, {
url: url
});
}
});
});
}
});
如果我们不想在s3上传,只需返回aws lambda生成的文件。您有什么问题?什么不起作用?您看到了什么错误?该代码假定您的文件总是在250毫秒内完成编写。收听流
已完成
事件会更安全:谢谢你,我已经按照你说的做了更改,效果很好
pdf.create(event.html, options).toStream(function(err, stream) {
if (err) {
console.log('pdf err : ', err);
} else {
var stream = stream.pipe(fs.createWriteStream(output));
stream.on('finish', function () {
s3.putObject({
Bucket : awsInfo.bucket,
Key : folderRoot + '/' + output_filename,
Body : fs.createReadStream(output),
ContentType : "application/pdf"
},
function(error, data) {
if (error != null) {
console.log("error: " + error);
return cb(null, {
err: error
});
} else {
var url = baseUrl + '/' + output_filename
return cb(null, {
url: url
});
}
});
});
}
});