2014-06-10 201 views
1

我正在做一個POST調用到我的服務器響應類型arraybuffer,它是目前返回與下面的頭一個PDF斑點:觸發的網頁瀏覽器下載

"Content-Type": "application/pdf" 
"Content-Transfer-Encoding": "binary" 
"Content-Disposition": "attachment;filename=file.pdf\" 

我然後創建一個blob網址從響應:

var url = URL.createObjectURL(blob); 

有沒有什麼辦法可以觸發文件下載這個blob的工作跨瀏覽器?我想要標準文件下載發生,就好像用戶點擊了一個鏈接,例如<a href="/file.pdf"></a>

我已經試過:

  • 使用URL作爲SRC一個腳本標記,它得到的斑點,但沒有下載
  • 使用它作爲URL在iFrame
  • 使用它作爲對象和嵌入標籤的數據url,但它顯示的是對象而不是下載它
+0

我認爲這能解決你的問題,至少在Chrome:http://stackoverflow.com/questions/6468517/force-download-of-datatext-plain-url – flamingcow

+0

這需要用戶點擊一個第二個鏈接,並且在IE中不起作用,所以這不能解決我的問題。 – Bill

回答

1

這就是我最終解決問題的方式。我使用生成文檔所需的數據創建一個新表單,將表單的目標設置爲我創建的iframe,然後提交表單。這會導致文件被正確下載。然後我最終使用服務器設置的cookie來確定下載何時完成。

var token = "my-form"; 

var form = document.createElement('form'); 
form.setAttribute('method', 'post'); 
form.setAttribute('target', token); 
form.setAttribute('action', "/my_target_url"); 

var hiddenField = document.createElement('input'); 
hiddenField.setAttribute('type', 'hidden'); 
hiddenField.setAttribute('name', 'data'); 
hiddenField.setAttribute('value', JSON.stringify(data_to_submit)); 
form.appendChild(hiddenField); 
element.append(form); 

var frame = document.createElement('iframe'); 
frame.setAttribute('id', token); 
frame.setAttribute('name', token); 
frame.setAttribute('src', ''); 
frame.setAttribute('style', 'width:0;height:0;border:0px solid #fff;'); 
element.append(frame); 

form.submit(); 
相關問題