P粉0717437322023-08-17 12:50:47
檔案副檔名其實與此並沒有太多關係... Content-Type
頭才有關係。
根據您的描述,我猜測當獲取PDF文件時,伺服器在回應中沒有使用正確的類型,而是發送它們作為application/octet-stream
或其他類型。 (這是一種通用類型,瀏覽器預設會下載它們。)
有幾種方法可以解決這個問題。一種方法是使用ServiceWorker來根據需要重寫Content-Type
頭部。不過,這並不總是有效的。當頁面被強制重新載入或啟用隱私權模式時,瀏覽器經常會停用Service Worker。
另一種更接近您提議的方法是在JavaScript中以記憶體方式取得PDF。您可以使用Fetch API來實現這一點,然後建立一個Blob URL,並讓瀏覽器下載它。尚未經過測試,但大致如下:
const res = await fetch('https://example.com/doc.pdf.fake-ext'); if (!res.ok) { throw new Error(`${res.status} ${res.statusText}`); } const blob = await res.blob(); const blobUrl = URL.createObjectURL(blob); // 现在,您可以直接链接或重定向到`blobUrl`。 // 完成后一定要释放它,使用URL.revokeObjectURL()。
請注意,這對於特別大的文件可能不起作用。小型文檔則沒有問題。
也要注意,並非所有瀏覽器都能顯示PDF,也並非所有系統都配置允許瀏覽器自行顯示PDF。