2016-02-26 18 views
8

Tôi đang sử dụng pdfkit (https://github.com/devongovett/pdfkit) trên máy chủ nút của mình, thường tạo tệp pdf và sau đó tải chúng lên s3. Vấn đề là các ví dụ pdfkit gửi tài liệu pdf vào một dòng ghi nút, ghi tệp vào đĩa, tôi đã làm theo ví dụ và hoạt động chính xác, tuy nhiên yêu cầu của tôi bây giờ là đưa tài liệu pdf vào luồng bộ nhớ thay vì lưu nó trên đĩa (tôi đang tải lên s3 anyway). Tôi đã làm theo một số quy trình luồng bộ nhớ của nút nhưng không ai trong số họ dường như làm việc với đường ống pdf với tôi, tôi chỉ có thể viết chuỗi vào luồng bộ nhớ. Vì vậy, câu hỏi của tôi là: Làm thế nào để ống đầu ra bộ pdf vào một dòng bộ nhớ (hoặc một cái gì đó giống nhau) và sau đó đọc nó như là một đối tượng để tải lên s3?Nút js, đường ống pdfkit vào luồng bộ nhớ

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

Cảm ơn trước.

Trả lời

3

Không cần phải sử dụng một trung gian bộ nhớ dòng – chỉ đường ống pdfkit đầu ra dòng trực tiếp vào một dòng HTTP tải lên.

Theo kinh nghiệm của tôi, AWS SDK là rác khi nói đến làm việc với các luồng, vì vậy tôi thường sử dụng request.

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

doc.pipe(upload); 

1 - trên thực tế, nó thường là không mong muốn sử dụng một dòng bộ nhớ vì đó có nghĩa là bộ nhớ tạm thời điều toàn bộ trong RAM, đó là chính xác những gì con suối có nghĩa vụ phải tránh!

+0

Tôi đã thử điều này, nhưng dường như tôi không có kinh nghiệm về việc kết thúc đường ống hoặc kết thúc việc sử dụng 'yêu cầu ' vì vậy tôi đã gặp lỗi này: ' [grunt-develop]> events.js: 141 throw er ; // Unhandled 'lỗi' sự kiện ^ Lỗi: đọc ECONNRESET tại exports._errnoException (util.js: 856: 11) tại TLSWrap.onread (net.js: 544: 26) >> ứng dụng thoát với mã 1' –

+0

Khi một dòng có thể đọc được (ở đây, 'doc') kết thúc, nó sẽ tự động cho luồng ghi được nó được gửi đến (' upload') mà nó đã kết thúc. Nếu bạn muốn biết khi nào việc ghi (upload) được thực hiện, hãy lắng nghe sự kiện ['finish'] (https://nodejs.org/api/stream.html#stream_event_finish). – josh3736

+0

Và dấu vết ngăn xếp đó cho biết bạn không nghe các sự kiện 'lỗi' trên thứ gì đó đang bị ngắt kết nối. Thêm các trình lắng nghe 'error' để bạn có thể xác định chính xác những gì đang bị ngắt kết nối. Nếu đó là yêu cầu 'upload' của bạn, điều đó khá lạ. – josh3736

0

Bạn có thể thử một cái gì đó như thế này và tải nó lên S3 bên trong sự kiện 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

Xin chào bolav, cảm ơn đề xuất của bạn, tuy nhiên vấn đề của tôi là tôi không muốn sử dụng 'fs.createWriteStream' trên máy chủ. –

+0

Có. Tôi nghĩ rằng bạn hiểu rằng bạn đã có thể thay thế những gì tôi đã làm để chứng minh rằng tôi có thể viết nó vào một tập tin với một cái gì đó mà tải lên S3. Làm thế nào để bạn tải các tập tin của bạn lên S3? – bolav

+0

'awsservice.putS3Object (objectToUpload, fileName, fileType, folder) .then (function() { }, từ chối);' –

Các vấn đề liên quan