2014-11-04 75 views
9

我試圖在我的NodeJS服務器上創建文件下載功能時遇到了一些意外的行爲。 我有一個REST(express)API調用一些導出數據函數,它在服務器上創建一個CSV文件並使用res.download('path/to/file')觸發下載。 響應標題包括內容處置:附件不觸發下載對話框

Content-Disposition:attachment; filename="indicators.csv" 
Content-Length:30125 
Content-Type:text/csv; charset=UTF-8 

所以一切似乎都是按順序的。

事情是,我從服務器獲取純文本的響應。響應包含CSV文件包含的所有數據,但不會像我打算的那樣觸發瀏覽器的文件下載對話框。 我在Chrome和FF上都嘗試過。這個問題依然存在於兩者中。

任何想法?

更新

我設法讓它通過創建一個虛擬的形式,並使用其提交的行動使我AJAX調用工作。但這是一個醜陋的黑客攻擊,我仍然在尋找更優雅的解決方案。

回答

11

標題不是問題。問題在於您通過調用ajax調用來查詢下載url,該調用不會調用瀏覽器下載對話框。您的選項歸結爲以下幾點:

  1. 使用提交到您的下載網址的表單。相反,具有可見形式的用戶進行交互,創造出形式JavaScript,並通過調用form.submit編程方式提交 - Handle file download from ajax post

  2. window.location的下載網址。您可以在當前窗口中做到這一點 - download file using an ajax request,或在一個新的 - res.download() not working in my case

+0

正如你可以看到我的問題,選項1是我最終使用。但我必須承認,對我而言,選項2可能是更優雅的解決方案。 – yarons 2015-09-01 05:19:23

0

您可以嘗試使用不同的內容類型,這樣就不會像在瀏覽器上的文本文件打開:

Content-Type:application/ms-excel; charset=UTF-8 

另一種選擇是使用應用程序/八位字節流爲MIME類型將其定義爲可下載的文件,而無需更好的描述。

Content-Type:application/octet-stream; charset=UTF-8 
+0

已經嘗試過。沒有工作 – yarons 2015-08-31 13:04:20