通过REST API下载二进制文件

时间:2016-08-11 16:57:05

标签: javascript ajax rest download

我有一个系统,我需要生成一个PDF文件。我想通过REST API 访问它,当然,也可以在本地存储文件。

文件内容取决于许多参数,该文件的内容应该是什么,即时间:从 - 到,过滤器,排序和许多,更多的参数;它们形成一个完全适合POST参数的JSON对象。参数不能通过GET,因为它们太大了。

FileSaver库可以在现代浏览器上完美运行。我创建了一个online demo。但是当我下载旧的浏览器 - firefox11,firefox12,firefox15时,它根本不起作用,即使我包含了Blob.js polyfill - 它打开了一个新的标签,其中包含以下网址:blob:457-343457-34574567-4576456无法使用得救我需要支持许多浏览器,而不仅仅是新浏览器。

问题是 - 我的SPA应用程序中有JSON参数对象 - 我该如何设计这个PDF二进制文件下载

我在想3种方法:

  • 强制浏览器在localhost上创建文件 - 使用FileSaver。对于现代浏览器来说,WOrk很好,对旧的浏览器不起作用
  • 创建可下载链接。我向REST API发送POST,包含所有参数,REST API返回类似于:{"download": "mysite.com/download/ms2h5d34h53m"}的内容,响应用于显示指向用户的链接;用户可能会点击链接(没有AJAX),服务器端API应该像过去一样返回一个文件。
  • 不是我的,但是我读到的某个地方我可以创建一个不可见的形式,向服务器发射POST,从而触发文件下载(这可能会减少返回{"download": "mysite.com/download/ms2h5d34h53m"} JSON的步骤)

我需要有关如何做到这一点的指导。

我尝试在下面创建一个测试express.js服务器。当我直接访问http://localhost:8081/download时,我看到本地下载的PDF文件。但是当我尝试通过ajax / js访问它时:

enter image description here

然后将内容作为二进制流提取:

enter image description here

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);
});

0 个答案:

没有答案