2016-02-26 73 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);' –