2016-02-26 13 views
8

मैं अपने नोड सर्वर पर pdfkit (https://github.com/devongovett/pdfkit) का उपयोग कर रहा है, आमतौर पर पीडीएफ फाइलों को सृजित करने, और फिर उन्हें S3 पर अपलोड करने के लिए पाइपिंग pdfkit। समस्या यह है कि पीडीएफकिट उदाहरण पीडीएफ दस्तावेज़ को नोड लिखने वाली धारा में पाइप करते हैं, जो डिस्क को फ़ाइल लिखता है, मैंने उदाहरण का पालन किया और सही तरीके से काम किया, हालांकि मेरी आवश्यकता अब पीडीएफ दस्तावेज़ को स्मृति स्ट्रीम में पाइप करने के बजाय पाइप करने के लिए है यह डिस्क पर (मैं वैसे भी s3 पर अपलोड कर रहा हूँ)। मैंने कुछ नोड मेमोरी स्ट्रीम प्रक्रियाओं का पालन किया है, लेकिन उनमें से कोई भी मेरे साथ पीडीएफ पाइप के साथ काम नहीं कर रहा है, मैं सिर्फ मेमोरी स्ट्रीम में स्ट्रिंग लिख सकता हूं। तो मेरा सवाल है: पीडीएफ किट आउटपुट को मेमोरी स्ट्रीम (या कुछ समान) में कैसे पाइप करें और फिर इसे एस 3 पर अपलोड करने के लिए ऑब्जेक्ट के रूप में पढ़ें?नोड जे एस, एक स्मृति धारा

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

अग्रिम धन्यवाद।

उत्तर

3

एक मध्यवर्ती स्मृति धारा – सिर्फ पाइप एक HTTP अपलोड धारा में pdfkit उत्पादन धारा सीधे उपयोग करने के लिए कोई ज़रूरत नहीं है।

मेरे अनुभव में, एडब्ल्यूएस एसडीके कचरा है जब धाराओं के साथ काम करने की बात आती है, इसलिए मैं आमतौर पर request का उपयोग करता हूं।

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

doc.pipe(upload); 

1 - वास्तव में, यह आमतौर पर एक स्मृति धारा का उपयोग करने के अवांछनीय मतलब है क्योंकि कि राम में पूरी बात है, जो वास्तव में है क्या धाराओं से बचने के लिए की अपेक्षा की जाती बफरिंग है!

+0

मैंने यह कोशिश की, लेकिन मुझे लगता है कि पाइप समाप्त करने या 'अनुरोध' के उपयोग को समाप्त करने का अनुभव नहीं है, इसलिए मुझे यह त्रुटि हुई: '[grunt-develop]> events.js: 141 फेंकने वाला एर ; // बिना क्रिया 'त्रुटि' घटना ^ त्रुटि: exports._errnoException पर ECONNRESET पढ़ें (util.js: 856: 11) TLSWrap.onread पर (net.js: 544: 26) >> आवेदन कोड के साथ बाहर निकल गया 1' –

+0

जब एक पठनीय धारा (यहां, 'doc') समाप्त होता है, तो यह स्वचालित रूप से लिखने योग्य धारा को बताएगा (इसे अपलोड करें) जो इसे समाप्त हो गया है। यदि आप जानना चाहते हैं कि लिखने योग्य (अपलोड) कब किया जाता है, तो ['finish' event] (https://nodejs.org/api/stream.html#stream_event_finish) को सुनें। – josh3736

+0

और वह स्टैक ट्रेस इंगित करता है कि आप डिस्कनेक्ट होने वाली किसी चीज़ पर 'त्रुटि' घटनाओं को नहीं सुन रहे हैं। 'त्रुटि' श्रोताओं को जोड़ें ताकि आप यह निर्धारित कर सकें कि डिस्कनेक्ट हो रहा है। यदि यह आपका 'अपलोड' अनुरोध है, तो यह काफी अजीब है। – 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

हां। मैंने सोचा कि आप समझ गए हैं कि आपने यह साबित करने के लिए जो किया है उसे बदलने में सक्षम थे कि मैं इसे एस 3 पर अपलोड की गई किसी चीज़ के साथ फ़ाइल में लिख सकता हूं। आप अपनी फाइलें एस 3 पर कैसे अपलोड करते हैं? – bolav

+0

'awsservice.putS3Object (objectToUpload, fileName, fileType, फ़ोल्डर) .थ (फ़ंक्शन() { }, अस्वीकार करें;; –

संबंधित मुद्दे