我有一个API端点,它在一个PUT上提供一个PDF,Content-Type "application/pdf"
(你可能会问“为什么PUT而不是GET?”,答案是“它很复杂,我无法改变它“)。来自PUT的PDF通过Blob URI
我想(客户端)请求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,调用URL.createObjectURL()
的BLOB得到一个网址,该网址传递给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内容(即%PDF-1.3.....
)的原始ASCII。
我猜这是某种内容类型的问题,即如果我可以在url上设置内容类型,那么Chrome会将响应解释为PDF。有关如何做到这一点的任何建议?
由于创建BLOB!是的,它做到了(不需要'Uint8Array',只是'arrayBuffer'的原始结果)。想要补充和添加为答案,我会接受它? –