2012-06-22 96 views
1

我試圖通過GET ajax調用來動態請求文件下載。我有以下的客戶端代碼:Node.js/Express:通過ajax下載文件

$(function() { 
    $('#submit').click(function() { 
     $.ajax({ 
      type: "GET", 
      url: "/download/" + "filename", 
      dataType: "json", 
      contentType: "application/json", 
      complete: function() { 
       console.log('Complete'); 
      }, 
      success: function() { 
       console.log('Success'); 
      }, 
      error: function() { 
       console.log('Error'); 
      } 
     }); 
    }); 
}); 

在節點服務器我也有以下行(請注意,我不知道這是否是這樣做的正確方法)

app.get('/download/:filename', function(req, res) { 
    console.log(req.params); 
    res.write(fs.readFileSync(__dirname + "/../public/javascripts/main.js", 'utf8')); 
}); 

所以我想實際下載該JavaScript文件(最終動態地)。我會如何正確地做這件事?有些東西告訴我我需要指定標題/內容類型。

+0

我很確定你不能用Ajax做到這一點。更好的策略是將文件加載到iframe *和*根據@Bit Destroyer的建議設置標題。 – apsillers

+0

Per @apsillers建議,如果我沒有弄錯,當瀏覽器重定向到具有上述標題的文件時,它實際上並不從當前頁面瀏覽,而只是打開保存文件對話框。考慮到這一點,iframe可能是多餘的,但不要拿我的話來說。 (ba da dum) – jamesmillerio

+0

@坐,有趣!我必須檢查一下,看看它是否可以跨瀏覽器使用。 – apsillers

回答

4

你應該與內容類型和配置設置返回:

Content-Type: application/octet-stream 
Content-Disposition: attachment;filename=\"main.js\" 

我相信你必須重定向到這個文件雖然。如果我沒有弄錯,你不能強制通過AJAX調用下載文件。

+1

對不起,接受的答案花了這麼長時間。謝謝! – grep

1

您是否打算將.js文件解釋並應用到下載頁面?

如果是這樣,您可能會最終使用write()頁面,無論您如何獲取它,這不會是最佳實踐。請致電require.js。這是異步和動態加載腳本並在運行時應用它們的更好方法。

使用手動解決方案下載動態.js文件時遇到的一個困難是依賴關係。在.js文件依賴於另一個會導致盲js未定義的錯誤。

此外,在將同步包含文件轉換爲異步包含文件方面,還有運行時性能優化增益。

Require.js很好地解決了這些問題。

希望有所幫助。 一切順利! Clint

+0

我其實想要下載該文件。不要將其包含在頁面上,或通過瀏覽器重定向到文本表示。 – grep

+0

謝謝你的澄清。我很抱歉。注意XSRF安全漏洞,特別是如果JS來自除你以外的任何地方。希望有所幫助。納什。 –