【发布时间】:2014-07-30 16:07:35
【问题描述】:
这是我在不使用 JQuery 的情况下尝试完成的(IE 9+、Chrome、FF、Safari):
- 使用一些数据对我的 API 端点进行 http POST 调用
- 服务器动态生成 PDF 并将 PDF 作为二进制附件返回
- 浏览器执行默认下载行为并在不刷新页面的情况下下载 PDF
基本上,我希望获得类似于<a href="test.pdf"> 的行为,但在进行 POST 调用而不是 GET 调用后动态生成的 PDF。
我尝试了很多不同的方法,但它们要么不能跨浏览器工作(例如使用带有 blob URL 的 $window.open()),要么被弹出窗口阻止程序阻止(任何 $window 调用之外的点击范围),或者没有导致 PDF 被自动下载(任何 $http POST 解决方案)。
我终于找到了一个似乎可行的解决方案,它使用 javascript 创建一个表单并提交它。
var form = document.createElement('form');
form.setAttribute('method', 'post');
form.setAttribute('action', myurl);
var params = {foo: 'bar'};
for(var key in params) {
if(params.hasOwnProperty(key)) {
var hiddenField = document.createElement('input');
hiddenField.setAttribute('type', 'hidden');
hiddenField.setAttribute('name', key);
hiddenField.setAttribute('value', params[key]);
form.appendChild(hiddenField);
}
}
document.body.appendChild(form);
form.submit();
这成功完成了上面的 3 个步骤,但现在我遇到了一个新问题。无法确定 PDF 文件何时已成功下载。这使我无法删除表单并向用户显示友好的“请稍候...”消息。还有一个额外的问题是提交表单也会取消任何未完成的 ajax 请求,这不是最佳的。
我可以完全控制服务器和客户端,那么解决此问题的最佳方法是什么?我不想将 PDF 保存在服务器上,因此在这种情况下,传回一个 url 并从客户端执行第二个 GET 请求将不起作用。谢谢!
【问题讨论】: