来自PUT的PDF在新窗口中通过Blob URI

时间:2017-10-05 21:12:45

标签: javascript google-chrome pdf

我有一个API端点,它在PUT上提供一个带有Content-Type "application/pdf"的PDF(你可能会问“为什么一个PUT而不是一个GET?”而答案就是“它很复杂,我无法改变它”)。

我想(客户端),请求PDF并在window.open()调用中显示结果(即在新窗口中显示PDF)。以前我使用数据URI来执行此操作,即:

window.open('data:application/pdf,<the data payload from the response>');

但在Chrome 60中,此功能不再有效(您无法在window.open中使用数据URI,请参阅https://bugs.chromium.org/p/chromium/issues/detail?id=751135)。

我现在更改了客户端代码以执行相同端点的fetch(),从响应中创建blob,在blob上调用URL.createObjectURL()以获取URL,并将该url传递给window.open()来电。即我有类似的东西:

fetch('http://somedomain.com/rest/getMyPdf', {
    method: 'PUT', 
    ... some headers & the body ...
}).then(function(response) {
    return response.blob();
}).then(function(blob) {
    window.open(URL.createObjectURL(blob));
});

这适用于Firefox(我在新窗口中获得PDF),但在Chrome中您只能看到PDF内容的原始ASCII(即%PDF-1.3.....)。

我猜这是某种内容类型的问题,即如果我可以在网址上设置内容类型,则Chrome会将响应解释为PDF。有关如何做到这一点的任何建议吗?

1 个答案:

答案 0 :(得分:1)

尝试

var data = response.arraybuffer();

然后从with the right content type

创建一个Blob
var = new Blob(data, 'application/pdf');