我有一个大系统,我需要生成一个PDF文件。我想通过REST API 访问它,当然,也可以在本地存储文件。
文件内容取决于许多参数,该文件的内容应该是什么,即时间:从 - 到,过滤器,排序和许多,更多的参数;它们形成一个完全适合POST参数的JSON对象。参数不能通过GET,因为它们太大了。
FileSaver库可以在现代浏览器上完美运行。我创建了一个online demo。但是当我下载旧的浏览器 - firefox11,firefox12,firefox15时,它根本不起作用,即使我包含了Blob.js polyfill - 它打开了一个新的标签,其中包含以下网址:blob:457-343457-34574567-4576456
无法使用得救我需要支持许多浏览器,而不仅仅是新浏览器。
问题是 - 我的SPA应用程序中有JSON参数对象 - 我该如何设计这个PDF二进制文件下载?
我在想3种方法:
{"download": "mysite.com/download/ms2h5d34h53m"}
的内容,响应用于显示指向用户的链接;用户可能会点击链接(没有AJAX),服务器端API应该像过去一样返回一个文件。{"download": "mysite.com/download/ms2h5d34h53m"}
JSON的步骤)我需要有关如何做到这一点的指导。
我尝试在下面创建一个测试express.js服务器。当我直接访问http://localhost:8081/download
时,我看到本地下载的PDF文件。但是当我尝试通过ajax / js访问它时:
然后将内容作为二进制流提取:
var fs = require('fs');
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World');
});
app.get('/download', function(req, res){
var file = fs.readFileSync(__dirname + '/example.pdf', 'binary');
res.setHeader('Content-Type', 'application/pdf');
res.setHeader('Content-Length', file.length);
res.setHeader('Content-Disposition', 'attachment; filename=new-name.pdf');
res.setHeader('filename', 'sample.pdf');
res.write(file, 'binary');
res.end();
});
var server = app.listen(8081, function () {
var host = server.address().address;
var port = server.address().port;
console.log("Example app listening at http://%s:%s", host, port);
});