2017-10-05 43 views
1

我有一个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。有关如何做到这一点的任何建议?

+0

由于创建BLOB!是的,它做到了(不需要'Uint8Array',只是'arrayBuffer'的原始结果)。想要补充和添加为答案,我会接受它? –

回答