2016-02-26 30 views
8

Düğüm sunucumda pdfkit (https://github.com/devongovett/pdfkit) kullanıyorum, genellikle pdf dosyaları oluşturup bunları s3'e yüklüyorum. Sorun, pdfkit örneklerinin pdf dokümanını diske yazdığı bir node yazma akışına pipetlemesini, bu örneği takip ettiğimi ve doğru bir şekilde çalıştığını göstermekteyim, ancak gereksinimim artık pdf dokümanını kaydetmek yerine bir bellek akışına aktarmaktır. diskte (yine de s3'e yüklüyorum). Bazı düğümlü bellek akışı prosedürlerini takip ettim ama hiçbiri benimle pdf borusu ile çalışmıyor gibi görünüyor, sadece bellek akışlarına dizeler yazabiliyordum. Sorularım: pdf kit çıktılarını bir bellek akışına (veya benzer bir şeye) nasıl aktarabilirim ve sonra s3'e yüklemek için bir nesne olarak okuyunuz? peşinNode js, bir bellek akışına pipet pdfkit

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

teşekkürler.

cevap

3

bir ara bellek akışı – sadece boru HTTP yükleme akımı içerisine doğrudan pdfkit çıkış akımı kullanmaya gerek yoktur.

Benim deneyimimle, AWS SDK akışlarla çalışırken geldiği zaman çöptür, bu yüzden genellikle request kullanın.

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

doc.pipe(upload); 

1 - bu akışları önlemek için gereken tam olarak ne olduğunu RAM'de tüm şey, tamponlama anlamına gelir, çünkü aslında, genellikle bir bellek akımının kullanılması istenmemektedir!

+0

Bunu denedim, ancak boruları sonlandırmak ya da 'request' kullanımını sona erdirmek istemiyorum bu yüzden bu hatayı aldım: '[grunt-develop]> events.js: 141 throw er ; TLSWrap.onread de // işlenmemiş özel 'hatası' olayı ^ Hata: exports._errnoException de ECONNRESET oku (11 util.js: 856) (net.js: 544: 26) >> uygulama kodunu çıkıldı 1 ' –

+0

Okunabilir bir akış (burada, "doc") bittiğinde, otomatik olarak yazılacağı yazılabilir akışa sona erdiğini ('upload') söyleyecektir. Yazılabilir (upload) işleminin ne zaman yapıldığını bilmek istiyorsanız, ['finish' event] 'i (https://nodejs.org/api/stream.html#stream_event_finish) dinleyin. – josh3736

+0

Ve bu yığın izlemesi, bağlantısız olan bir şeyde 'error' olaylarını dinlemediğinizi gösterir. 'Hata' dinleyicileri ekleyin, böylece bağlantınızın kesildiğini tam olarak belirleyebilirsiniz. Eğer 'upload' talebiniz buysa, bu oldukça garip. – josh3736

0

Böyle bir şey deneyebilir ve end olayının içindeki S3'e yükleyebilirsiniz.

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

Merhaba bolav, öneriniz için teşekkürler, ancak benim problemim sunucuda 'fs.createWriteStream' kullanmak istemiyorum. –

+0

Evet. S3'e yüklenen bir şeyle bir dosyaya yazabileceğimi kanıtlamak için yaptığım şeyi değiştirebileceğinizi anladığını sanıyordum. Dosyalarınızı S3'e nasıl yüklersiniz? – bolav

+0

'awsservice.putS3Object (objectToUpload, dosyaAdı, dosyaTipi, klasör) .then (işlev() { }, reddetme);' –