2012-12-03 17 views
1

我有一個網站,我可以在其中提供下載/流媒體文件在另一臺服務器上的鏈接。 目前我如何有它的設置是類似下面的內容:NodeJS:有沒有一種方法可以從另一臺服務器流式傳輸文件而不需要通過我的管道?

download = (req, res) -> 
    song_id = req.params.id 
    download_url = "http://mediaserver.com/#{song_id}" 
    console.log("Returning download from: #{download_url}") 
    res.set('Content-Type', 'audio/mpeg') 
    res.set('Content-Disposition', 'attachment; filename="download.mp3"') 
    request.get(download_url).pipe(res) 
    #For some reason, express.js on a response end event emits a finish 
    #http://www.samcday.com.au/blog/2011/06/27/listening-for-end-of-response-with-nodeexpress-js/ 
    res.on "finish",()-> 
    console.log("Completed song download") 

不過,我正在尋找一種方法,我可以只返回一個HTTP響應對象,告訴瀏覽器只從相應下載服務器而不是我自己的? (可能仍會更改HTTP標頭以允許將文件保存爲下載)。

這是可能的任何方式?

TY

回答

2

只需使用301(永久)或302(臨時)與位置報頭重定向。

response.writeHead(302, { 
    'Location': 'http://someUrlHere' 
}); 

我不是一個快速的用戶,但它看起來像你可以用res.send(302)設置在快遞的狀態代碼。

+0

但我希望該文件來作爲下載或能夠流。我還能用301或302嗎? – Setheron

+0

@Setheron,無論您是服務於該文件還是其他人,該如何處理資源完全取決於瀏覽器。是的,當然你仍然可以流式傳輸。至於它的下載取決於用戶的瀏覽器是否默認打開該資源。不,您將無法在未提供服務的資源上設置「Content-Disposition」標題。 – Brad

+0

到目前爲止,我之所以能夠管理它,是因爲我可以設置內容配置(正如你可以在我的例子中看到的那樣)。問題是我希望有一個下載按鈕的體驗......我想這似乎沒有辦法做到這一點,除非我通過自己管它。 – Setheron

0

你不能簡單地提供鏈接到託管實際文件的服務器,那麼瀏覽器將點擊時下載它們?

例如

<a href="http://www.assets.com/file.mp3">File</a> 
+0

簡單的鏈接不會改變瀏覽器是否下載或試圖打開資源。這取決於瀏覽器,它可能受到Content-Disposition頭部的影響。 – Brad

+0

對,我想我明白Op正在嘗試做什麼。強制下載行爲正確嗎?然後我同意你的觀點,只有添加標題的真正方法是在源服務器沒有Content-Disposition標頭的情況下自行代理請求。 – groodt

相關問題