首页 > 解决方案 > 在我调用 doc.end() 之前,PDFKIT 不会在 http 响应上开始流式传输

问题描述

我正在使用 pdfkit 在运行时生成 pdf 并在 http 响应中返回它以供下载。我可以在浏览器端下载文件,但下载对话框没有立即打开。相反,它一直等到 doc.end 被调用。我猜 pdfkit 无法有效地推送流。有没有其他人遇到过这个?如果是,请指导。

这是我正在尝试的示例代码

exports.testPdfKit = functions.https.onRequest((request, response) => {
    //create pdf document
    doc.pipe(response);

    response.set('Content-Disposition', `attachment;filename=testpdfstream.pdf`);
    response.writeHead(200, { 'Content-Type': 'application/pdf' })

    const bigText = "some big text"

    for (var i = 0; i < 1000; i++) {
        console.log('inside iteration -',i)
        doc.text(bigText);
        doc.addPage();
    }
    doc.end()
});

我在 firebase 函数上实现了这个功能,它在内部使用 expressjs 来处理 http 请求。为了最终生成更大的文件,流媒体对我来说是必须的。

标签: firebaseexpressgoogle-cloud-functionsstreamingpdfkit

解决方案


HTTP 函数不能流式传输函数的输入或输出。整个请求在一块内存中传递,响应被收集并在一块中发送回客户端。两者的最大大小为 10MB。Cloud Functions 的这种限制没有解决方法(但它确实可以帮助您更好地扩展系统)。

如果您需要流式传输或 websocket,则需要使用不同的产品,例如应用引擎或计算引擎。


推荐阅读