2016-02-26 76 views
8

我在我的节点服务器上使用pdfkit(https://github.com/devongovett/pdfkit),通常创建pdf文件,然后将它们上传到s3。 问题是pdfkit示例将pdf文档转换为节点写入流,将文件写入磁盘,我遵循示例并正确工作,但是现在我的要求是将pdf文档传输到内存流而不是保存它在磁盘上(我正在上传到s3)。 我跟随了一些节点内存流程程序,但它们都没有和我一起使用pdf管道,我只能写字符串到内存流。 所以我的问题是:如何将pdf套件输出传输到内存流(或类似的东西),然后将其作为上传到s3的对象读取?节点js,管道pdfkit到内存流

var fsStream = fs.createWriteStream(outputPath + fileName); 
 
doc.pipe(fsStream);

在此先感谢。

回答

3

没有必要使用一个中间存储器流 –只是管直接pdfkit输出流成HTTP载流。

根据我的经验,AWS SDK在处理流时是垃圾,所以我通常使用request

var upload = request({ 
    method: 'PUT', 
    url: 'https://bucket.s3.amazonaws.com/doc.pdf', 
    aws: { bucket: 'bucket', key: ..., secret: ... } 
}); 

doc.pipe(upload); 

1 - 事实上,它通常不希望使用一个内存流,因为这意味着在缓冲RAM整个事情,而这正是数据流都应该避免什么!

+0

我试过了,但是我似乎没有结束管道的经验或者结束'request'的使用,所以我结束了这个错误: '[grunt-develop]> events.js:141 throw er ; //未处理 '错误' 事件 ^ 错误:在exports._errnoException读ECONNRESET (util.js中:856:11) 在TLSWrap.onread(net.js:544:26) >>应用退出,代码1' –

+0

当一个可读流(这里是'doc')结束时,它会自动告诉它被传送给('upload')的可写流已经结束。如果您想知道可写(上传)何时完成,请监听['finish'事件](https://nodejs.org/api/stream.html#stream_event_finish)。 – josh3736

+0

而且这个堆栈跟踪表明你没有在正在断开连接的东西上侦听错误事件。添加'error'听众,以便您可以确切地确定什么是断开连接。如果这是你的“上传”请求,那很奇怪。 – josh3736

0

你可以尝试这样的事情,并将其上传到S337的end事件中。

var doc = new pdfkit(); 

var MemoryStream = require('memorystream'); 
var memStream = new MemoryStream(null, { 
    readable : false 
}); 

doc.pipe(memStream); 

doc.on('end', function() { 
    var buffer = Buffer.concat(memStream.queue); 
    awsservice.putS3Object(buffer, fileName, fileType, folder).then(function() { }, reject); 
}) 
+0

嗨bolav,感谢您的建议,但我的问题是,我不想在服务器上使用'fs.createWriteStream'。 –

+0

是的。我以为你明白你可以取代我所做的事情来证明我可以用上传到S3的文件将它写入文件。你如何上传你的文件到S3? – bolav

+0

'awsservice.putS3Object(objectToUpload,fileName,fileType,folder).then(function(){ },reject);' –