2016-02-26 16 views
8

私のノードサーバーでpdfkit(https://github.com/devongovett/pdfkit)を使用しています。通常はpdfファイルを作成し、s3にアップロードします。 問題は、pdfkitの例がpdf docをノード書き込みストリームにパイプすることです。このストリームはファイルをディスクに書き込みます。例を辿って正しく動作しましたが、私の要件は今はpdf docを保存するのではなくメモリストリームにパイプすることですそれはディスク上にあります(私はとにかくs3にアップロードしています)。 私はいくつかのノードメモリストリームの手順に従ってきましたが、それらのどれも私と一緒にpdfパイプでは動作しないようです。文字列をメモリストリームに書き込むだけでした。 私の質問は:どのようにpdfのキットの出力をメモリストリーム(または同様のもの)にパイプしてから、それをs3にアップロードするオブジェクトとして読み込むのですか?事前にノードjs、pdfkitをメモリストリームに接続

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

感謝。

答えて

3

直接HTTPアップロード・ストリームに –ちょうどパイプにpdfkit出力ストリームを中間メモリストリームを使用する必要はありません。

私の経験では、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

私はこれを試しましたが、パイプの終了や "要求"の使用を終了した経験がないので、このエラーが発生しました: '[grunt-develop]> events.js:141 thrower ; //未処理の 'エラー' イベント ^ エラー:読み取り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'イベントをリッスンしていないことを示します。 'error'リスナーを追加して、何が切断されているのかを正確に判断することができます。それがあなたの 'アップロード'要求の場合、それはかなり奇妙です。 – josh3736

0

このようなことを試して、endイベントのS3にアップロードすることができます。

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

こんにちは、あなたの提案のおかげで、私の問題は私が 'fs.createWriteStream'をサーバー上で使いたくないということです。 –

+0

はい。私はS3にアップロードしたものでファイルに書き込むことができたことを証明するために行ったことをあなたが置き換えることができたとあなたが理解していると思いました。どのようにファイルをS3にアップロードしますか? – bolav

+0

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

関連する問題