我正在使用https://github.com/DaftMonk/generator-angular-fullstack生成的meanjs
应用程序。我正在尝试使用phantomjs
生成一个.pdf文件,并将其下载到浏览器。
问题是下载的.pdf文件总是显示空白页,而不管页数是多少。服务器上的原始文件未损坏。当我进一步调查时,发现下载的文件总是比磁盘上的原始文件大得多。此外,此问题仅在.pdf文件中发生。其他文件类型工作正常。
我尝试过几种方法,比如res.redirect('http://localhost:9000/assets/exports/receipt.pdf');
,res.download('client\\assets\\exports\\receipt.pdf')
,
var fileSystem = require('fs');
var stat = fileSystem.statSync('client\\assets\\exports\\receipt.pdf');
res.writeHead(200, {
'Content-Type': 'application/pdf',
'Content-Length': stat.size
});
var readStream = fileSystem.createReadStream('client\\assets\\exports\\receipt.pdf');
return readStream.pipe(res);
甚至我也尝试过使用https://github.com/expressjs/serve-static,结果没有任何变化。
我是nodejs
的新手。将.pdf文件下载到浏览器的最佳方法是什么?
更新:我正在Windows8.1 64位计算机上运行此程序
发布于 2015-05-03 14:01:51
我在提供静态pdf时也有损坏。我尝试了上面建议的所有方法。然后我发现:在本质上,通常很好的连接负载(package ~0.4.0)的https://github.com/intesso/connect-livereload/issues/39正在破坏pdf。所以只要让它忽略pdf就可以了:
app.use(require('connect-livereload')({ignore: ['.pdf']}));
现在,它可以工作了:
app.use('/pdf', express.static(path.join(config.root, 'content/files')));
...great解脱。
发布于 2015-04-10 22:05:08
这是一种从express提供文件的干净方法,并使用attachment
标头来确保文件已下载:
var path = require('path');
var mime = require('mime');
app.get('/download', function(req, res){
//Here do whatever you need to get your file
var filename = path.basename(file);
var mimetype = mime.lookup(file);
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
res.setHeader('Content-type', mimetype);
var filestream = fs.createReadStream(file);
filestream.pipe(res);
});
发布于 2015-04-26 21:17:15
有几种方法可以做到这一点:
(app.use(express.static(Pathtofile);链接如下:
现在,您可以使用浏览器中的url直接打开文件,如下所示:
window.open('http://localhost:9000/assets/exports/receipt.pdf');
或
res.redirect('http://localhost:9000/assets/exports/receipt.pdf');
应该可以用了。
buf.toString('base64'); base64String = var
然后设置内容类型:
res.writeHead(200, {
'Content-Type': 'application/pdf',
'Content-Length': stat.size
});
并将数据作为响应发送。我会试着举一个这样的例子。
编辑:你甚至不需要对它进行编码。你还是可以试一试。但我甚至不需要编码就能让它工作。
此外,您也不需要设置标头。Express为您做到了这一点。下面是API代码片段,用于在pdf不是public/static的情况下获取pdf。你需要API来服务pdf:
router.get('/viz.pdf', function(req, res){
require('fs').readFile('viz.pdf', function(err, data){
res.send(data);
})
});
最后,请注意,用于获取pdf的url具有扩展名pdf,这是为了让浏览器识别传入的文件是pdf。否则,它将保存文件而不带任何扩展名。
https://stackoverflow.com/questions/29562954
复制相似问题