下载返回空文件
Download returning empty file
我正在构建一个 node.js+express 应用程序,用户将在其中输入一些数据,然后生成带有 pdfkit 的 PDF,然后将文件发送给用户。我能够成功生成文件,问题是当我下载生成的文件时,它是空的。我什至无法打开 PDF,reader(预览版,macOS 中的本机 reader)显示文件为空。我正在使用以下代码:
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;
你知道为什么我下载的文件是空的,而在服务器中却能正确生成吗?
谢谢!
你真的需要实体文件吗?如果没有,那么您可以直接流式传输到客户端:
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;
如果您同时需要物理文件和下载响应(就像我一样),您可以等待流的 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);
}
})
});
我正在构建一个 node.js+express 应用程序,用户将在其中输入一些数据,然后生成带有 pdfkit 的 PDF,然后将文件发送给用户。我能够成功生成文件,问题是当我下载生成的文件时,它是空的。我什至无法打开 PDF,reader(预览版,macOS 中的本机 reader)显示文件为空。我正在使用以下代码:
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;
你知道为什么我下载的文件是空的,而在服务器中却能正确生成吗?
谢谢!
你真的需要实体文件吗?如果没有,那么您可以直接流式传输到客户端:
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;
如果您同时需要物理文件和下载响应(就像我一样),您可以等待流的 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);
}
})
});