1. 程式人生 > >POST請求下載檔案

POST請求下載檔案

今天幫同事看一個問題:後端由於種種原因(不想改介面或者說前端引數過大),只能接受用post去下載檔案。

正常情況下第一反應是用xhr物件去傳送post請求,結果並沒有觸發瀏覽器的下載。看了一下responseHeader裡已經設定了content-dispositon:attachment。很鬱悶,於是試著window.open(URL.createObjectURL(new Blob(res))),只是inline的形式打開了這個檔案,並沒有觸發瀏覽器下載行為。

最後發現,其實不是header的問題,問題是AJAX並不會喚起瀏覽器的下載視窗,AJAX設計的初衷就是用來實現非同步重新整理的,用以改善原始的form表單提交重新整理頁面的問題。具體的官方證據暫時還沒找到,只有stackoverflow。

所以選擇有以下:
1. 建立一個隱形的表單來提交,設定formtarget_blank來彈出下載對話方塊。此種方法相容性最好。
2. URL.createObjectURL(new Blob(res),利用前端H5提供的adownload屬性來下載。IE11都不相容。
3. IE10、IE11有一個方法window.navigator.msSaveBlob可以將File或Blob物件儲存到本地磁碟。
4. 說服後端用get。