2016-02-26 11 views
8

Ich benutze pdfkit (https://github.com/devongovett/pdfkit) auf meinem Knoten-Server, in der Regel erstellen PDF-Dateien, und dann auf s3 hochladen. Das Problem ist, dass pdfkit Beispiele Pipe doc in einen Knoten schreiben Stream, der die Datei auf die Festplatte schreibt, folgte ich dem Beispiel und funktionierte korrekt, aber meine Anforderung ist jetzt, die PDF-Dokument zu einem Speicher-Stream statt speichern es auf der Festplatte (ich lade sowieso auf s3 hoch). Ich habe einige Node-Speicher-Streams-Prozeduren gefolgt, aber keiner von ihnen scheint mit PDF-Pipe mit mir zu arbeiten, ich könnte nur Strings in Speicher-Streams schreiben. Also meine Frage ist: Wie die PDF-Kit-Ausgabe zu einem Speicher-Stream (oder etwas Ähnliches) pipes und dann lesen Sie es als ein Objekt auf s3 hochladen?Knoten js, Rohrleitung pdfkit zu einem Speicherstream

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

Vielen Dank im Voraus.

Antwort

3

Es gibt keine Notwendigkeit, einen Zwischenspeicher Strom – gerade Rohr des PDFKit Ausgangsstrom in einen HTTP-Sendedatenstrom direkt zu verwenden.

Meiner Erfahrung nach ist das AWS SDK Müll, wenn es um die Arbeit mit Streams geht, also verwende ich normalerweise request.

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

doc.pipe(upload); 

1 - in der Tat ist es in der Regel unerwünscht, einen Speicherstrom zu verwenden, weil das bedeutet, dass die ganze Sache in RAM Pufferung, das ist genau das, was Strom vermeiden soll!

+0

Ich habe das versucht, aber ich habe keine Erfahrung mit dem Beenden von Pipes oder Beenden der Verwendung von 'Anfrage' , so endete ich mit diesem Fehler: ' [grunt-develop]> events.js: 141 throw er ; // Nicht behandelte 'Fehler' Ereignis ^ Fehler: lesen ECONNRESET bei exports._errnoException (util.js: 856: 11) bei TLSWrap.onread (net.js: 544: 26) >> Anwendung mit Code verlassen 1 ' –

+0

Wenn ein lesbarer Stream (hier, 'doc') endet, wird automatisch der beschreibbare Stream, an den er weitergeleitet wurde (' upload'), der beendet wurde, angezeigt. Wenn Sie wissen möchten, wann der Schreibvorgang (Upload) abgeschlossen ist, warten Sie auf das ['Finish'-Ereignis] (https://nodejs.org/api/stream.html#stream_event_finish). – josh3736

+0

Und dieser Stack-Trace zeigt an, dass Sie nicht auf "Fehler" -Ereignisse auf etwas warten, das unterbrochen wird. Fügen Sie 'error'-Listener hinzu, damit Sie genau bestimmen können, was unterbrochen wird. Wenn es deine 'Upload'-Anfrage ist, ist das ziemlich seltsam. – josh3736

0

Sie könnten so etwas versuchen und laden Sie es auf S3 innerhalb der end Veranstaltung.

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

Hallo Bolav, danke für Ihren Vorschlag, aber mein Problem ist, dass ich 'fs.createWriteStream' nicht auf dem Server verwenden möchte. –

+0

Ja. Ich dachte, du würdest verstehen, dass du ersetzen könntest, was ich getan habe, um zu beweisen, dass ich es in eine Datei mit etwas schreiben könnte, das auf S3 hochgeladen wurde. Wie laden Sie Ihre Dateien auf S3 hoch? – bolav

+0

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