我有一个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。有关如何做到这一点的任何建议吗?
答案 0 :(得分:1)
尝试
var data = response.arraybuffer();
然后从with the right content type
创建一个Blobvar = new Blob(data, 'application/pdf');