使用socket.io从string发送文件到浏览器

时间:2013-04-23 22:16:21

标签: node.js socket.io pdfkit

我在node.js项目中使用PDFKit和socket.io,当用户单击前端的按钮时生成pdf。如何从最终用户流式传输或以其他方式将结果pdf发送给最终用户?我宁愿避免将文件保存到文件系统,然后如果我可以...之后不得不删除它...希望以某种方式流式传输它。

socket.on('customerRequestPDF', function(){              
    doc = new PDFDocument;        

    doc.text('Some text goes here', 100, 100);

    //I could do this but would rather avoid it
    doc.write('output.pdf');

    doc.output(function(string) {
        //ok I have the string.. now what?

    });

});

1 个答案:

答案 0 :(得分:1)

websocket实际上并不是提供PDF的合适机制。只需使用常规HTTP请求。

// assuming Express, but works similarly with the vanilla HTTP server
app.get('/pdf/:token/filename.pdf', function(req, res) {
    var doc = new PDFDocument();
    // ...

    doc.output(function(buf) { // as of PDFKit v0.2.1 -- see edit history for older versions
        res.writeHead(200, {
             'Content-Type': 'application/pdf',
             'Cache-Control': 'private',
             'Content-Length': buf.length
        });
        res.end(buf);
    });
});

现在提醒一句:此PDF库已损坏。从版本0.2.1开始,输出是正确的Buffer,但它在内部使用已弃用的binary字符串编码而不是Buffer s。 (以前的版本为您提供了二进制编码的字符串。)来自docs

  

'binary' - 一种通过仅使用每个字符的前8位将原始二进制数据编码为字符串的方法。不推荐使用此编码方法,应尽可能避免使用Buffer对象。在将来的Node版本中将删除此编码。

这意味着当节点删除二进制字符串编码时,库将停止工作。