下载返回空文件

时间:2017-11-15 15:21:57

标签: node.js express pdfkit

我正在构建一个node.js + express应用程序,用户将在其中输入一些数据,生成一个带有pdfkit的PDF,并将该文件发送给用户。我能够成功生成文件,问题是当我下载生成的文件时,它是空的。我甚至无法打开PDF,阅读器(预览,macOS中的本机阅读器)说文件是空的。我使用以下代码:

var express = require('express');
var router = express.Router();
var guid = require('guid');
var PDFDocument = require('pdfkit');
var fs = require('fs');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.post('/criar', function(req, res, next) {
    var filename = guid.raw()+'.pdf';
    var doc = new PDFDocument();
    doc.pipe(fs.createWriteStream(filename));

    doc.font('fonts/UbuntuMono-R.ttf')
        .fontSize(25)
        .text('Some text with an embedded font!', 100, 100);

    doc.end();

    res.download(filename, 'rifas.pdf', function(err){
        if(!err){
            fs.unlink(filename);
        }
    })
});

module.exports = router;

您是否知道我的下载文件为何空,而在服务器中它们是否正确生成?

谢谢!

2 个答案:

答案 0 :(得分:3)

你真的需要物理文件吗?如果没有,那么您可以直接流式传输到客户端:

var express = require('express');
var router = express.Router();
var PDFDocument = require('pdfkit');
var fs = require('fs');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.post('/criar', function(req, res, next) {
    var doc = new PDFDocument();
    doc.pipe(res);

    doc.font('fonts/UbuntuMono-R.ttf')
        .fontSize(25)
        .text('Some text with an embedded font!', 100, 100);

    doc.end();

});

module.exports = router;

答案 1 :(得分:0)

如果您既需要物理文件又需要下载响应(就像我一样),则可以等待流的close事件:

let stream = fs.createWriteStream(filename);
doc.pipe(stream);
// Do whatever you need with doc
doc.end();
stream.on("close", () => {
    res.download(filename, 'rifas.pdf', function(err){
        if(!err){
            fs.unlink(filename);
        }
    })
});