2016-02-26 13 views
8

Używam pdfkit (https://github.com/devongovett/pdfkit) na moim serwerze węzła, zwykle tworząc pliki pdf, a następnie przesyłając je do s3. Problem polega na tym, że przykłady PDFkit doprowadzają plik PDF do strumienia zapisu węzła, który zapisuje plik na dysk, podążyłem za przykładem i działałem poprawnie, jednak moim wymaganiem jest teraz poprowadzenie dokumentu PDF do strumienia pamięci zamiast zapisywania to na dysku (mimo to ładuję do s3). Podążyłem za procedurami strumieni pamięci węzłów, ale żaden z nich nie wydaje się pracować ze mną z rurą pdf, mógłbym tylko napisać ciągi do strumieni pamięci. Moje pytanie brzmi: jak wypakować wyjście zestawu pdf do strumienia pamięci (lub czegoś podobnego), a następnie odczytać go jako obiekt do przesłania do s3?Węzeł js, piping pdfkit do strumienia pamięci

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

góry dzięki.

Odpowiedz

3

Nie ma potrzeby stosowania pośredni strumień pamięci z komputera – tylko rury strumień wyjściowy PDFKit bezpośrednio do przesyłania strumienia HTTP.

Z mojego doświadczenia wynika, że ​​pakiet SDK AWS to śmieci, jeśli chodzi o pracę ze strumieniami, więc zazwyczaj używam request.

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

doc.pipe(upload); 

1 - w rzeczywistości jest to zazwyczaj niepożądane w użyciu strumienia pamięci, ponieważ to oznacza, buforowanie całą rzecz w pamięci RAM, która jest dokładnie to, co strumienie mają unikać!

+0

Próbowałem tego, ale wydaje mi się, że nie mam doświadczenia z zakończeniem rur lub zakończeniem użycia 'request' , więc skończyłem na tym, że miałem ten błąd: ' [grunt-develop]> events.js: 141 throw er ; // nieobsługiwany 'błąd' wydarzenie ^ Błąd: czytaj ECONNRESET na exports._errnoException (util.js: 856: 11) na TLSWrap.onread (net.js: 544: 26) >> aplikacja wyszła z kodem 1' –

+0

Gdy skończy się czytelny strumień (tutaj, 'doc'), automatycznie poinformuje on zapisywalny strumień, do którego jest podłączony (" upload "), że został zakończony. Jeśli chcesz się dowiedzieć, kiedy zapisywalny (upload) jest zrobiony, posłuchaj zdarzenia "' finish' "(https://nodejs.org/api/stream.html#stream_event_finish). – josh3736

+0

A ten ślad stosu wskazuje, że nie słuchasz zdarzeń "error" na czymś, co się rozłącza. Dodaj detektory "błędów", aby dokładnie określić, co się rozłącza. Jeśli jest to twoja prośba o przesłanie, to jest dość dziwne. – josh3736

0

Możesz spróbować czegoś podobnego i przesłać go do S3 wewnątrz wydarzenia 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

Cześć bolav, dziękuję za sugestię, jednak moim problemem jest to, że nie chcę używać 'fs.createWriteStream' na serwerze. –

+0

Tak. Sądziłem, że rozumiesz, że udało ci się zastąpić to, co zrobiłem, aby udowodnić, że mogę zapisać je do pliku z czymś przesłanym do S3. Jak przesłać pliki do S3? – bolav

+0

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

Powiązane problemy